SQL Server - Partition by 和 Group by對比


參考:https://www.cnblogs.com/hello-yz/p/9962356.html

——————————————————

今天大概弄懂了partition by和group by的區別聯系。

1. group by是分組函數,partition by是分析函數(然后像sum()等是聚合函數);

2. 在執行順序上,

以下是常用sql關鍵字的優先級

from > where > group by > having > order by

而partition by應用在以上關鍵字之后,實際上就是在執行完select之后,在所得結果集之上進行partition。

3. partition by相比較於group by,能夠在保留全部數據的基礎上,只對其中某些字段做分組排序(類似excel中的操作),而group by則只保留參與分組的字段和聚合函數的結果(類似excel中的pivot)。

partition by

group by

4. 如果在partition結果上聚合,千萬注意聚合函數是逐條累計運行結果的!而在group by后的結果集上使用聚合函數,會作用在分組下的所有記錄上。

數據如下,

SQL1

select a.cc,a.item,sum(a.num)
from table_temp a
group by a.cc,a.item

Result1

11條記錄經group by后為10條,其中cc='cn' and item='8.1.1'對應的兩條記錄的num匯總成值3.

SQL2

復制代碼
select a.cc,a.num, min(a.num) over (partition by a.cc order by a.num asc) as amount
from table_temp a
group by a.cc,a.num;

select a.cc,a.num, min(a.num) over (partition by a.cc order by a.num desc) as amount
from table_temp a
group by a.cc,a.num;
復制代碼

Result2

  

兩個sql的唯一區別在於a.num的排序上,但從結果紅框中的數據對比可以看到amount值並不相同,且第二個結果集amount並不都是最小值1。

在這里就是要注意將聚合函數用在partition后的結果集上時,聚合函數是逐條累積計算值的!

其實partition by常同row_number() over一起使用,

select a.*, row_number() over (partition by a.cc,a.item order by a.num desc) as seq
from table_temp a

 

清醒時做事,糊塗時讀書,大怒時睡覺,獨處時思考; 做一個幸福的人,讀書,旅行,努力工作,關心身體和心情,成為最好的自己 -- 共勉


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM