Получить последнее измерение - PullRequest
1 голос
/ 07 апреля 2020

У меня есть таблица с некоторыми измерениями, идентификатором и датой.

Таблица построена следующим образом:

ID     DATE    M1    M2
1      2020     1    NULL
1      2020    NULL   15
1      2018     2    NULL
2      2019     1    NULL
2      2019    NULL   1

Я хотел бы получить таблицу с одним строка на ID с самым последним измерением

ID M1 M2
1  1  15
2  1   1

Есть идеи?

Ответы [ 3 ]

1 голос
/ 07 апреля 2020

Можно использовать коррелированный подзапрос с агрегацией:

select id, max(m1), max(m2)
from t 
where t.date = (select max(t1.date) from t t1 where t1.id = t.id)
group by id;
0 голосов
/ 07 апреля 2020

В стандарте SQL вы можете использовать lag(ignore nulls):

select id, coalesce(m1, prev_m1), coalesce(m2, prev_m2)
from (select t.*, 
             lag(m1 ignore nulls) over (partition by id order by date) as prev_m1,
            lag(m2 ignore nulls) over (partition by id order by date) as prev_m2,
             row_number() over (partition by id order by date desc) as seqnum
      from t
     ) t
where seqnum = 1;
0 голосов
/ 07 апреля 2020

Использование ROW_NUMBER в сочетании с агрегацией:

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY DATE DESC) rn
    FROM yourTable
)

SELECT ID, MAX(M1) AS M1, MAX(M2) AS M2
FROM cte
WHERE rn = 1
GROUP BY ID;

Номер строки позволяет ограничиться только записями для каждого ID, имеющего самую последнюю дату года. Затем мы агрегируем, чтобы найти максимальные значения для M1 и M2.

...