4 回答

TA貢獻1862條經驗 獲得超7個贊
乍一看...
您只需要一個GROUP BY
具有MAX
聚合函數的子句:
SELECT id, MAX(rev)FROM YourTableGROUP BY id
從來沒有這么簡單,是嗎?
我剛剛注意到你也需要這個content
專欄。
這是SQL中一個非常常見的問題:在每個組標識符的列中查找具有一些最大值的行的整個數據。在我的職業生涯中,我聽到了很多。實際上,這是我在當前工作的技術面試中回答的問題之一。
實際上,StackOverflow社區創建一個標記只是為了處理這樣的問題:每個組中最大的n。
基本上,您有兩種方法可以解決該問題:
加入簡單的group-identifier, max-value-in-group
子查詢
在這種方法中,您首先group-identifier, max-value-in-group
在子查詢中找到(上面已經解決過)。然后將表連接到子查詢,group-identifier
并且兩者都相等max-value-in-group
:
SELECT a.id, a.rev, a.contentsFROM YourTable aINNER JOIN ( SELECT id, MAX(rev) rev FROM YourTable GROUP BY id) b ON a.id = b.id AND a.rev = b.rev
Left加入self,調整連接條件和過濾器
在這種方法中,你自己加入了表。當然,平等在于group-identifier
。然后,2個聰明的舉動:
第二個連接條件是左側值小于右側值
當你執行第1步時,實際具有最大值的行將
NULL
在右側(它是aLEFT JOIN
,記住嗎?)。然后,我們過濾連接結果,僅顯示右側所在的行NULL
。
所以你最終得到:
SELECT a.*FROM YourTable aLEFT OUTER JOIN YourTable b ON a.id = b.id AND a.rev < b.revWHERE b.id IS NULL;
結論
兩種方法都帶來了完全相同的結果。
如果有兩行max-value-in-group
for group-identifier
,則兩行都將在結果中。
這兩種方法都是SQL ANSI兼容的,因此,無論其“風味”如何,它都可以與您喜歡的RDBMS一起使用。
這兩種方法都具有性能友好性,但您的里程可能會有所不同(RDBMS,DB結構,索引等)。所以,當你選擇一種方法而不是另一種方法時,基準。并確保你選擇對你最有意義的一個。

TA貢獻1789條經驗 獲得超8個贊
我的偏好是使用盡可能少的代碼......
你可以IN 嘗試這樣做:
SELECT *
FROM t1 WHERE (id,rev) IN
( SELECT id, MAX(rev)
FROM t1
GROUP BY id
)
在我看來它不那么復雜......更容易閱讀和維護。

TA貢獻1785條經驗 獲得超8個贊
我很驚訝,沒有答案提供SQL窗口功能解決方案:
SELECT a.id, a.rev, a.contents FROM (SELECT id, rev, contents, ROW_NUMBER() OVER (PARTITION BY id ORDER BY rev DESC) rank FROM YourTable) a WHERE a.rank = 1
在SQL標準ANSI / ISO標準SQL:2003中添加,后來使用ANSI / ISO標準SQL:2008進行了擴展,現在所有主要供應商都可以使用窗口(或窗口)功能。有更多類型的排名函數可用于處理平局問題:RANK, DENSE_RANK, PERSENT_RANK
。
添加回答
舉報