表基本上看起来像最新的条目:PostgreSQL的选择对于给定的ID
串行ID,ID,日期,数据,数据,数据等
有可能为同一ID多行。我想创建此表的一个视图,用于仅显示每个ID的最新条目的报告。它应该显示所有的列。
有人可以帮助我的SQL选择?谢谢。
表基本上看起来像最新的条目:PostgreSQL的选择对于给定的ID
串行ID,ID,日期,数据,数据,数据等
有可能为同一ID多行。我想创建此表的一个视图,用于仅显示每个ID的最新条目的报告。它应该显示所有的列。
有人可以帮助我的SQL选择?谢谢。
有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
类型)的每一行。
我敢打赌,带有row_number()的版本将是最快的。 – 2012-02-27 23:13:25
我会写第四个。 – Michas 2012-02-28 01:02:49