Table1 :
group_id | user_id |
1 | 11 |
1 | 111 |
1 | 11111 |
2 | 22 |
2 | 222 |
3 | 33 |
3 | 333 |
我們想要選出各group_id最大的user_id,也就是說我們希望的結果要像是如下這樣:
group_id | user_id |
1 | 11111 |
2 | 222 |
3 | 333 |
先來看一下ROW_NUMBER()語句的,如下所示,詳細資料可參考這裡:
ROW_NUMBER ( ) OVER ( [ PARTITION BY value_expression , ... [ n ] ] order_by_clause )
它可對傳回結果集的各分割區進行編列序號,各分割區序號從 1 開始,利用這個我們就可完成我們的需求。
思路是這樣的:先把Table1以group_id進行分組(partition),各組進行以user_id的DESC排序並標上編號(例如group_id=1的三組資料編號1,2,3、group_id=2的二組資料編號1,2),接著取出各組最上面那行資料,也就是各組編號為1的那行即可。
這時我們就可以使用rownumber, over, partition語法指令來幫助我們達成目標。
我們先用以下語法對Table1以group_id進行分組,並對各組以user_id做DESC排序,並為給組的排序標上編號,Sort
SELECT *, ROW_NUMBER() OVER (PARTITION BY group_id Order By user_id DESC) As Sort FROM Table1
這樣就會得到以下結果:
group_id | user_id | Sort |
1 | 11111 | 1 |
1 | 111 | 2 |
1 | 11 | 3 |
2 | 222 | 1 |
2 | 22 | 2 |
3 | 333 | 1 |
3 | 33 | 1 |
接著在跟Table1結合並選出Sort=1但不會select Sort欄位就行了,可以使用如下語句:
SELECT group_id, user_id FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY group_id Order By user_id DESC) As Sort FROM Table1 ) SortTable WHERE SortTable.Sort = 1這樣就大功告成了。
參考資料: