Postgresql

如何在過濾出每個組的值的同時對行進行分組?

  • March 17, 2020

假設您有以下設置:

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

分析(又名視窗)函式非常強大,並且會獎勵無數倍的時間來學習它們!我已經把我在小提琴中遵循的邏輯中的步驟留下了,所以(加上上面的教程連結)應該會給你一個好的開始。

引用自:https://dba.stackexchange.com/questions/262018