Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 запрос  [new]
domka
Guest
есть табличка:

comment

id_comment    id_news   add_date
1                      1            12/02/2007
2                      1            13/02/2007
3                      2            15/02/2007
4                      2            14/02/2007  
5                      3            17/02/2007

Нужно получить:
id_comment    id_news   add_date
2                      1            13/02/2007
3                      2            15/02/2007  
5                      3            17/02/2007


То есть все уникальные значения id_news при этом вывести те id_news у которых add_date имеет наибольшее значение. Подскажите куды копать яму.
4 сен 07, 11:18    [4616446]     Ответить | Цитировать Сообщить модератору
 Re: запрос  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
domka
Подскажите куды копать яму.
в group by
4 сен 07, 11:19    [4616453]     Ответить | Цитировать Сообщить модератору
 Re: запрос  [new]
domka
Guest
JANNY ну да сгрупирую я по id_news а как потом выводить только те id_news у которых дата максимальна?
4 сен 07, 11:30    [4616527]     Ответить | Цитировать Сообщить модератору
 Re: запрос  [new]
vyv
Member

Откуда: Нск
Сообщений: 77
with tbl as (
select 1 as id_comment,1 as id_news, '12/02/2007' as add_date from dual union all
select 2 as id_comment,1 as id_news, '13/02/2007' as add_date from dual union all
select 3 as id_comment,2 as id_news, '15/02/2007' as add_date from dual union all
select 4 as id_comment,2 as id_news, '14/02/2007' as add_date from dual union all
select 5 as id_comment,3 as id_news, '17/02/2007' as add_date from dual)
select id_news, max(add_date), max(id_comment) keep (dense_rank last order by add_date)
from tbl
group by id_news
4 сен 07, 11:37    [4616577]     Ответить | Цитировать Сообщить модератору
 Re: запрос  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116156
SQL> with comments as
  2  (select 1 id_comment, 1 id_news, to_date('10/02/2007', 'DD/MM/YYYY') add_date
  3  from dual
  4  union all
  5  select 1 id_comment, 1 id_news, to_date('12/02/2007', 'DD/MM/YYYY') add_date
  6  from dual
  7  union all
  8  select 2 id_comment, 1 id_news, to_date('13/02/2007', 'DD/MM/YYYY') add_date
  9  from dual
 10  union all
 11  select 3 id_comment, 2 id_news, to_date('15/02/2007', 'DD/MM/YYYY') add_date
 12  from dual
 13  union all
 14  select 4 id_comment, 2 id_news, to_date('14/02/2007', 'DD/MM/YYYY') add_date
 15  from dual
 16  union all
 17  select 5 id_comment, 3 id_news, to_date('17/02/2007', 'DD/MM/YYYY') add_date
 18  from dual
 19  )
 20  select id_comment, id_news, add_date
 21    from (select id_comment,
 22                 id_news,
 23                 add_date,
 24                 dense_rank() over(partition by id_news order by add_date desc) dr
 25            from comments)
 26   where dr = 1
 27   order by 2, 1
 28  /
 
ID_COMMENT    ID_NEWS ADD_DATE
---------- ---------- -----------
         2          1 13.02.2007
         3          2 15.02.2007
         5          3 17.02.2007
 
SQL> 
4 сен 07, 11:39    [4616599]     Ответить | Цитировать Сообщить модератору
 Re: запрос  [new]
domka
Guest
Народ, ступил - все сам понял...после топика janny вспомнил, что есть агрегир ф-ция MAX()
4 сен 07, 11:40    [4616610]     Ответить | Цитировать Сообщить модератору
 Re: запрос  [new]
domka
Guest
dmidek пасибо за аналитическую ф-цию ранжирования!
4 сен 07, 11:41    [4616625]     Ответить | Цитировать Сообщить модератору
 Re: запрос  [new]
Elic
Member

Откуда:
Сообщений: 29979
domka
вспомнил, что есть агрегир ф-ция MAX()
Elic
RTFM FIRST/LAST (FAQ)
4 сен 07, 11:42    [4616637]     Ответить | Цитировать Сообщить модератору
 Re: запрос  [new]
domka
Guest
Вдогонку - Ребят, а как все это сделать для 8-ки ?
4 сен 07, 11:49    [4616695]     Ответить | Цитировать Сообщить модератору
 Re: запрос  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116156
domka
Вдогонку - Ребят, а как все это сделать для 8-ки ?


Какая версия восьмерки ? dense_rank() начиная с 8.1.7 ЕМНИП
4 сен 07, 11:51    [4616719]     Ответить | Цитировать Сообщить модератору
 Re: запрос  [new]
vyv
Member

Откуда: Нск
Сообщений: 77
https://www.sql.ru/forum/actualthread.aspx?tid=469682
4 сен 07, 11:52    [4616725]     Ответить | Цитировать Сообщить модератору
 Re: запрос  [new]
domka
Guest
dmidek хнык, версия 7-ая вообще !
4 сен 07, 12:08    [4616874]     Ответить | Цитировать Сообщить модератору
 Re: запрос  [new]
vyv
Member

Откуда: Нск
Сообщений: 77
Предыдущую ссылку смотрел?
Ответ Elic-а: "бабушкин метод"
4 сен 07, 12:17    [4616939]     Ответить | Цитировать Сообщить модератору
 Re: запрос  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116156
SQL> with comments as
  2  (select 1 id_comment, 1 id_news, to_date('10/02/2007', 'DD/MM/YYYY') add_date
  3  from dual
  4  union all
  5  select 1 id_comment, 1 id_news, to_date('12/02/2007', 'DD/MM/YYYY') add_date
  6  from dual
  7  union all
  8  select 2 id_comment, 1 id_news, to_date('13/02/2007', 'DD/MM/YYYY') add_date
  9  from dual
 10  union all
 11  select 3 id_comment, 2 id_news, to_date('15/02/2007', 'DD/MM/YYYY') add_date
 12  from dual
 13  union all
 14  select 4 id_comment, 2 id_news, to_date('14/02/2007', 'DD/MM/YYYY') add_date
 15  from dual
 16  union all
 17  select 5 id_comment, 3 id_news, to_date('17/02/2007', 'DD/MM/YYYY') add_date
 18  from dual
 19  )
 20  select id_news,
 21         max(add_date),
 22         substr(max(add_date||'~'||id_comment),length(max(add_date))+2)
 23         from comments
 24  group by id_news
 25  /
 
   ID_NEWS MAX(ADD_DATE) SUBSTR(MAX(ADD_DATE||'~'||ID_C
---------- ------------- ---------------------------------------------------
         1 13.02.2007    2
         2 15.02.2007    3
         3 17.02.2007    5
 
SQL> 
4 сен 07, 12:22    [4616992]     Ответить | Цитировать Сообщить модератору
 Re: запрос  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116156
dmidek

 
   ID_NEWS MAX(ADD_DATE) SUBSTR(MAX(ADD_DATE||'~'||ID_C
---------- ------------- ---------------------------------------------------
         1 13.02.2007    2
         2 15.02.2007    3
         3 17.02.2007    5
 
SQL> 


Нет. Логическая ошибка. Дата то преобразовывается.
Надо ее преобразовывать самому ...

select id_news,
       max(add_date),
       substr(max(to_char(add_date,'YYYYMMDD')||'~'||id_comment),10),
       from comments
group by id_news
/
4 сен 07, 13:04    [4617366]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить