close

最近在工作的時候挺無聊,突然想到一個問題...

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

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 頁頁頁六滴 的頭像
    頁頁頁六滴

    人森很精彩,所以要把所有事情都記起來=ˇ=

    頁頁頁六滴 發表在 痞客邦 留言(0) 人氣()