【发布时间】:2012-03-17 09:08:56
【问题描述】:
表格基本上看起来像:
Serial-ID、ID、日期、数据、数据、数据等
同一个 ID 可以有多个行。我想创建此表的视图以在报告中使用,该视图仅显示每个 ID 的最新条目。它应该显示所有列。
有人可以帮助我进行 SQL 选择吗?谢谢。
【问题讨论】:
标签: sql postgresql greatest-n-per-group
表格基本上看起来像:
Serial-ID、ID、日期、数据、数据、数据等
同一个 ID 可以有多个行。我想创建此表的视图以在报告中使用,该视图仅显示每个 ID 的最新条目。它应该显示所有列。
有人可以帮助我进行 SQL 选择吗?谢谢。
【问题讨论】:
标签: sql postgresql greatest-n-per-group
我会使用DISTINCT ON
CREATE VIEW your_view AS
SELECT DISTINCT ON (id) *
FROM your_table a
ORDER BY id, date DESC;
这是因为distinct on 抑制了括号中表达式重复的行。 DESC in order by 表示通常排在最后的那个将是第一个,因此是结果中显示的那个。
https://www.postgresql.org/docs/10/static/sql-select.html#SQL-DISTINCT
【讨论】:
大约有 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
【讨论】:
这对correlated subqueries 来说似乎很好用:
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 类型)。
【讨论】: