PostgreSQL选择给定ID的最新条目

Dis*_*ple 3 sql postgresql greatest-n-per-group

表基本上看起来像:

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

对于相同的ID,可以有多行.我想创建一个在Reports中使用的表的视图,它只显示每个ID的最新条目.它应该显示所有列.

有人可以帮助我选择SQL吗?谢谢.

J C*_*per 16

大约有5种不同的方法可以做到这一点,但这里有一个:

SELECT *
FROM yourTable AS T1 
WHERE NOT EXISTS(
    SELECT *
    FROM yourTable AS T2
    WHERE T2.ID = T1.ID AND T2.Date > T1.Date
)
Run Code Online (Sandbox Code Playgroud)

这是另一个:

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
Run Code Online (Sandbox Code Playgroud)

多一个:

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

好的,我被带走了,这是我要发布的最后一个(现在):

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
Run Code Online (Sandbox Code Playgroud)


Jas*_*sen 6

我会用 DISTINCT ON

CREATE VIEW your_view AS
SELECT DISTINCT ON (id) *
FROM your_table a
ORDER BY id, date DESC;
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为distinct on抑制了括号中表达式重复的行。DESCinorder by意味着通常最后排序的将是第一个,因此是结果中显示的那个。

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