PostgreSQL 选择给定 ID 的最新条目

问题描述 投票:0回答:3
表格本质上看起来像:

序列号、ID、日期、数据、数据、数据等

同一 ID 可以有多行。我想创建一个要在报告中使用的表视图,该视图仅显示每个 ID 的最新条目。它应该显示所有列。

有人可以帮我进行 SQL 选择吗?谢谢。

sql postgresql greatest-n-per-group
3个回答
25
投票
大约有 5 种不同的方法可以做到这一点,但这里有一个:

SELECT * FROM yourTable AS T1 WHERE NOT EXISTS( SELECT * FROM yourTable AS T2 WHERE T2.ID = T1.ID AND T2.Date > T1.Date )

这是另一个:

SELECT T1.* FROM yourTable AS T1 LEFT JOIN yourTable AS T2 ON ( T2.ID = T1.ID AND T2.Date > T1.Date ) WHERE T2.ID IS NULL

还有一个:

WITH T AS ( SELECT *, ROW_NUMBER() OVER(PARTITION BY ID ORDER BY Date DESC) AS rn FROM yourTable ) SELECT * FROM T WHERE rn = 1

好吧,我有点得意忘形了,这是我要发布的最后一篇(目前):

WITH T AS ( SELECT ID, MAX(Date) AS latest_date FROM yourTable GROUP BY ID ) SELECT yourTable.* FROM yourTable JOIN T ON T.ID = yourTable.ID AND T.latest_date = yourTable.Date
    

18
投票
我会用

DISTINCT ON


CREATE VIEW your_view AS SELECT DISTINCT ON (id) * FROM your_table a ORDER BY id, date DESC;
这是有效的,因为 

distinct on

 会抑制括号中表达式重复的行。 
DESC
 中的 
order by
 表示通常排在最后的那个将排在第一个,因此是结果中显示的那个。

https://www.postgresql.org/docs/10/static/sql-select.html#SQL-DISTINCT


0
投票
这似乎是

相关子查询的一个很好的用途

CREATE VIEW your_view AS SELECT * FROM your_table a WHERE date = ( SELECT MAX(date) FROM your_table b WHERE b.id = a.id )

您的日期列需要唯一标识每一行(如

TIMESTAMP

 类型)。

© www.soinside.com 2019 - 2024. All rights reserved.