今天大概弄懂了partition by和group by的區別聯繫。sql
1. group by是分組函數,partition by是分析函數(而後像sum()等是聚合函數);函數
2. 在執行順序上,spa
如下是經常使用sql關鍵字的優先級excel
from > where > group by > having > order by
而partition by應用在以上關鍵字以後,實際上就是在執行完select以後,在所得結果集之上進行partition。code
3. partition by相比較於group by,可以在保留所有數據的基礎上,只對其中某些字段作分組排序(相似excel中的操做),而group by則只保留參與分組的字段和聚合函數的結果(相似excel中的pivot)。blog
partition by排序
group byit
4. 若是在partition結果上聚合,千萬注意聚合函數是逐條累計運行結果的!而在group by後的結果集上使用聚合函數,會做用在分組下的全部記錄上。io
數據以下,table
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