postgresql - 仅选择唯一 ID 的最近日期
问题描述
这应该是一个要解决的简单问题,但由于某种原因,我无法理解如何有效地做到这一点......
假设我有一个看起来像这样的表(postgres):
ID | 日期 | 价值 |
---|---|---|
1 | 2021-04-01 | 1 |
1 | 2021-04-03 | 10 |
1 | 2021-04-04 | 8 |
1 | 2021-04-05 | 3 |
1 | 2021-04-08 | 5 |
2 | 2021-04-04 | 3 |
2 | 2021-04-05 | 5 |
2 | 2021-04-07 | 5 |
2 | 2021-04-10 | 9 |
2 | 2021-04-12 | 11 |
我的目标是为每个 id 提取 1 行,这是该 id 的最新记录。
该表需要注意的重要特征是,最近的日期(按 id)在不同的 id 中是不一样的。所以我不能简单地查询 max(date) 并使用它来查询数据。我必须首先找到每个 id 的最近日期,并使用它来查询数据。
成功的查询将导致以下响应:
ID | 日期 | 价值 |
---|---|---|
1 | 2021-04-08 | 5 |
2 | 2021-04-12 | 11 |
我也在对大量数据进行此查询,因此需要尽可能优化此解决方案。
解决方案
您可以使用窗口功能:
select * from
(
select * , row_number() over (partition by id order by date desc) rn
from yourtable
) t
where rn = 1