SELECT a.id, a.rev, a.contents FROM YourTable a INNERJOIN ( SELECT id, MAX(rev) rev FROM YourTable GROUPBY id ) b ON a.id = b.id AND a.rev = b.rev
方法二:使用自连接和筛选
对表进行自连接,连接条件为group-identifier相等。
第二个连接条件为左表的rev值小于右表的rev值。
筛选出右表id为NULL的行,这些行即为每个id对应的rev值最大的行。
1 2 3 4 5
SELECT a.* FROM YourTable a LEFTOUTERJOIN YourTable b ON a.id = b.id AND a.rev < b.rev WHERE b.id ISNULL;
方法三:使用IN子查询
1 2 3 4 5 6
SELECT* FROM t1 WHERE (id,rev) IN ( SELECT id, MAX(rev) FROM t1 GROUPBY id )
方法四:使用窗口函数
1 2 3 4 5
SELECT a.id, a.rev, a.contents FROM (SELECT id, rev, contents, ROW_NUMBER() OVER (PARTITIONBY id ORDERBY rev DESC) ranked_order FROM YourTable) a WHERE a.ranked_order =1
方法五:使用相关子查询
1 2 3 4
select yt.id, yt.rev, yt.contents from YourTable yt where rev = (selectmax(rev) from YourTable st where yt.id=st.id)
方法六:使用MAX()分析函数
1 2 3 4 5 6 7 8 9 10
SELECT t.* FROM ( SELECT id ,rev ,contents ,MAX(rev) OVER (PARTITIONBY id) as max_rev FROM YourTable ) t WHERE t.rev = t.max_rev
方法七:使用NOT EXIST
1 2 3 4 5 6 7 8
SELECT id, rev -- you can select other columns here FROM YourTable t WHERENOTEXISTS ( SELECT*FROM YourTable t WHERE t.id = id AND rev > t.rev )
方法八:使用Cross Apply(仅适用于MS SQL)
1 2 3 4 5 6 7 8 9
WITH DocIds AS (SELECTDISTINCT id FROM docs)
SELECT d2.id, d2.rev, d2.content FROM DocIds d1 CROSS APPLY ( SELECT Top 1*FROM docs d WHERE d.id = d1.id ORDERBY rev DESC ) d2
方法九:MySQL特定方法
1 2 3 4
SELECT id, MAX(rev) AS rev , 0+SUBSTRING_INDEX(GROUP_CONCAT(numeric_content ORDERBY rev DESC), ',', 1) AS numeric_content FROM t1 GROUPBY id
方法十:排序后分组(仅适用于MySQL)
1 2 3
select* from (select*from mytable orderby id, rev desc ) x groupby id
SELECTDISTINCT t1.id, MAX(t1.rev), MAX(t2.content) FROM Table1 AS t1 JOIN Table1 AS t2 ON t2.id = t1.id AND t2.rev = ( SELECTMAX(rev) FROM Table1 t3 WHERE t3.id = t1.id ) GROUPBY t1.id;