最近在工作的時候挺無聊,突然想到一個問題...
group by和partition by有什麼不同呢?
所以我就上網查了下...
這串獎的滿清楚的:
https://stackoverflow.com/questions/2404565/sql-server-difference-between-partition-by-and-group-by
基本上來說,是使用的時機不太一樣
總之group by是對整個query做group,通常用於對整個query做統整,並且減少多餘的row的數量時使用
partition by則是針對單一個window function,讓function依照partition by的分類去處理或計算等等
比如說以下的情境,今天有一個tableA長這樣:
id firstname lastname Mark
-------------------------------------------------------------------
1 arun prasanth 40
2 ann antony 45
3 sruthy abc 41
6 new abc 47
1 arun prasanth 45
1 arun prasanth 49
2 ann antony 49
今天想要統計每個firstname的mark總數,我們就可以用group by:
select SUM(Mark) as marksum, firstname as marksum from tableA group by firstname
marksum firstname
----------------
94 ann
134 arun
47 new
41 sruthy
這個是針對整個query做處理的情境,
他是對select SUM(Mark) as marksum, firstname as marksum from tableA這個query做分類,然後只列出每個分類的結果
因為裡面只有四個firstname,所以最後只會列出四個row
接下來看另一個partition by的情境,有一個tableB:
firstname lastname Mark
-------------------------------------------------------------------
arun prasanth 40
ann antony 45
sruthy abc 41
new abc 47
arun prasanth 45
arun prasanth 49
ann antony 49
看起來跟tableA挺像的,只是少了id
,現在想要依照firstname來排出每個firstname分別的Mark的大小順序
這邊先介紹一個function,Rank()
https://docs.microsoft.com/zh-tw/sql/t-sql/functions/rank-transact-sql?view=sql-server-ver15
其實點進去看一看就知道我要寫什麼了吧XD
select RANK() over (partition by b.firstname, order by b.Mark asc) as rank, b.firstname, b.Mark from tableB as b
id firstname Mark
----------------------------------
3 arun 40
2 arun 45
1 arun 49
2 ann 45
1 ann 49
1 sruthy 41
1 new 47
可以看到這邊依照每個firstname去做RANK()的排序跟給予編號
這種情境就是用partition by
所以說這樣看起來,這兩個就是使用的時機不太一樣,但其實都是對於分類的資料作處理
何時該使用就看情況吧XD
留言列表