2014-03-14 60 views
1

我必須做一個SQL查詢,我不知道該怎麼做。我想爲每個獨特的二人組A/B獲取最新的行。我正在使用postgresql。SQL查詢,每個獨特二人組的最新行

例如:
表:人

id A B modification_date 
1 5 6 2014-04-12 
2 6 7 2014-04-13 
3 5 6 2014-04-14 
4 9 1 2014-04-15 
5 6 7 2014-04-16 

而且我想獲得:

id A B modification_date 
3 5 6 2014-04-14 
4 9 1 2014-04-15 
5 6 7 2014-04-16 

感謝你的幫助。

+0

爲什麼'5 6在預期的結果2014-04-12'? 「最新」(即5/6的「最新」行應該是'5 6 2014-04-14',應該不是嗎? –

+0

你是對的a_horse_with_no_name,我更正了 – Alex

回答

1

SELECT爲(AB),然後JOIN回到原來的行上的每個GROUPMAX imum的modification_date得到的值(有必要得到id列):

SELECT t1.* 
FROM Person t1 
JOIN 
(
    SELECT MAX(modification_date) max_date, A, B 
    FROM Person 
    GROUP BY A, B 
) t2 ON t1.A = t2.A AND t1.B = t2.B AND t1.modification_date = t2.max_date 

更簡單地說,如果你不在乎哪個id你回來了,而且即使modification_date被複制,你也只需要一行,你可以選擇MIN im的值id,並用它做:

SELECT MIN(id) id, A, B, MAX(modification_date) modification_date 
FROM Person 
GROUP BY A, B 
+0

謝謝這個完美的作品! – Alex

0
SELECT id, a, b, modification_date 
FROM person p 
WHERE NOT EXISTS (
    SELECT * 
    FROM person nx 
    WHERE nxa = pa AND nx.b = p.b 
    AND (nx.modification_date > p.modification_date 
     OR nx.modification_date = p.modification_date AND nx.id > p.id) 
    );