Получить последнее значение из определенной группы (Oracle) - PullRequest
0 голосов
/ 29 июня 2018

У меня есть что-то вроде

    Date  Group ID
    11/01 'A'   1
    12/01 'A'   2
    13/01 'B'   3
    14/01 'B'   4

Что я в основном хочу, так это получить, например, последние новости из группы 'A'

    Date  Group ID LatestID_from_GROUP_A_ordered_by_recent_date
    11/01 'A'   1  2
    12/01 'A'   2  2
    13/01 'B'   3  2
    14/01 'B'   4  2

или, по крайней мере, что-то вроде этого

    Date  Group ID LatestID_from_GROUP_A_ordered_by_recent_date
    11/01 'A'   1  null
    12/01 'A'   2  null
    13/01 'B'   3  2
    14/01 'B'   4  2

Ответы [ 3 ]

0 голосов
/ 29 июня 2018

Как насчет этого:

with demo (somedate, somegroup, id) as
       ( select date '2018-01-11', 'A', 1 from dual union all
         select date '2018-01-12', 'A', 2 from dual union all
         select date '2018-01-13', 'B', 3 from dual union all
         select date '2018-01-14', 'B', 4 from dual union all
         select date '2018-01-15', 'A', 5 from dual  -- example from comments
       )
select somedate, somegroup, id
     , ( select max(id) keep (dense_rank last order by somedate)
         from   demo
         where  somegroup = 'A' ) as last_a
from   demo;

SOMEDATE    SOMEGROUP         ID     LAST_A
----------- --------- ---------- ----------
11/01/2018  A                  1          5
12/01/2018  A                  2          5
13/01/2018  B                  3          5
14/01/2018  B                  4          5
15/01/2018  A                  5          5

Обратите внимание, что max(id) - это только тай-брейк в случае нескольких строк с последней датой.

0 голосов
/ 29 июня 2018

Гордон был почти там.

Вы хотите создать окно для всего запроса, но выберите только самое большое значение 'A':

select 
  t.*,
  max(case when group = 'A' then id end) over (partition by 1) as latest_from_a
from t

'section by 1' создаст окно вашего полного набора результатов, потому что оно группирует только одно статическое значение: 1.

0 голосов
/ 29 июня 2018

Логика выглядит так:

select t.*,
       max(case when group = 'A' then id end) over (order by date) as latest_from_a
from t;

Приведенное выше получает совокупный максимум до каждой даты. Если вы хотите общий максимум:

select t.*,
       max(case when group = 'A' then id end) over () as latest_from_a
from t;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...