詳解partition by和group by對(duì)比
今天大概弄懂了partition by和group by的區(qū)別聯(lián)系。
1. group by是分組函數(shù),partition by是分析函數(shù)(然后像sum()等是聚合函數(shù));
2. 在執(zhí)行順序上,
以下是常用sql關(guān)鍵字的優(yōu)先級(jí)
from > where > group by > having > order by
而partition by應(yīng)用在以上關(guān)鍵字之后,實(shí)際上就是在執(zhí)行完select之后,在所得結(jié)果集之上進(jìn)行partition。
3.partition by相比較于group by,能夠在保留全部數(shù)據(jù)的基礎(chǔ)上,只對(duì)其中某些字段做分組排序(類(lèi)似excel中的操作),而group by則只保留參與分組的字段和聚合函數(shù)的結(jié)果(類(lèi)似excel中的pivot)。
partition by
group by
4.如果在partition結(jié)果上聚合,千萬(wàn)注意聚合函數(shù)是逐條累計(jì)運(yùn)行結(jié)果的!而在group by后的結(jié)果集上使用聚合函數(shù),會(huì)作用在分組下的所有記錄上。
數(shù)據(jù)如下,
SQL1
select a.cc,a.item,sum(a.num) from table_temp a group by a.cc,a.item
Result1
11條記錄經(jīng)group by后為10條,其中cc='cn' and item='8.1.1'對(duì)應(yīng)的兩條記錄的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
兩個(gè)sql的唯一區(qū)別在于a.num的排序上,但從結(jié)果紅框中的數(shù)據(jù)對(duì)比可以看到amount值并不相同,且第二個(gè)結(jié)果集amount并不都是最小值1。
在這里就是要注意將聚合函數(shù)用在partition后的結(jié)果集上時(shí),聚合函數(shù)是逐條累積計(jì)算值的!
其實(shí)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
到此這篇關(guān)于詳解partition by和group by對(duì)比的文章就介紹到這了,更多相關(guān)partition by和group by內(nèi)容請(qǐng)搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!
版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。