Postgresql
如何在過濾出每個組的值的同時對行進行分組?
假設您有以下設置:
CREATE TABLE namechanges ( id text, new_name text, change_date timestamp ); INSERT INTO namechanges VALUES ('x', 'alice', '2020-03-01'), ('y', 'Bob T.', '2020-03-03'), ('x', 'Alice', '2020-03-05'), ('z', 'charlie', '2020-03-07'), ('x', 'Alice C.', '2020-03-09'), ('z', 'Charlie Z.', '2020-03-11')
一個只檢索每個 id 的目前名稱並返回以下內容的查詢看起來如何?
| id | max | | --- | ---------- | | z | Charlie Z. | | y | Bob T. | | x | Alice C. |
如果您想使用它,這是上面 DB Fiddle 上的範例:https ://www.db-fiddle.com/f/ugNcXhRyb44KTpqjFXmKDW/0
做你想做的事的一個更好的方法是使用
ROW_NUMBER() Analytic function
如下(見 fiddle here)。它避免了連接字元串的“解決方法”,並且這些功能很棒 - 見下文。SELECT rn, id, new_name, change_date FROM ( SELECT ROW_NUMBER() OVER (PARTITION BY id ORDER BY id, change_date DESC) as rn, id, new_name, change_date FROM namechanges ORDER BY id, change_date DESC ) AS tab WHERE rn = 1 ORDER BY id, change_date;
結果:
rn id new_name change_date 1 x Alice C. 2020-03-09 00:00:00 1 y Bob T. 2020-03-03 00:00:00 1 z Charlie Z. 2020-03-11 00:00:00
分析(又名視窗)函式非常強大,並且會獎勵無數倍的時間來學習它們!我已經把我在小提琴中遵循的邏輯中的步驟留下了,所以(加上上面的教程連結)應該會給你一個好的開始。