我有一个表,其中包含一些度量,ID和日期。
表的构建如下
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
有什么想法吗?
您可以使用correlated子查询进行聚合:
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;
[结合使用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
的最大值。
在标准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;