2016年3月6日 星期日

[SQL] 於多筆重複資料中取得該重複群組中最新一筆資料

最近要做一件特別的SQL查詢,有個一個Table1,如下所示

Table1 :
group_iduser_id
111
1111
111111
222
2222
333
3333

我們想要選出各group_id最大的user_id,也就是說我們希望的結果要像是如下這樣:
group_iduser_id
111111
2222
3333

先來看一下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_iduser_idSort
1111111
11112
1113
22221
2222
33331
3331

接著在跟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
這樣就大功告成了。

參考資料:
  1. [SQL] 於多筆重複資料中取得該重複群組中最新一筆資料

沒有留言 :

張貼留言