對開窗函數(shù)有了更深的認(rèn)識
開窗函數(shù)是用于為行定義一個窗口(這里的窗口是指運(yùn)算將要操作的行的集合),能夠?qū)λ枰闹颠M(jìn)行操作辨泳,不需要使用GROUP BY子句對數(shù)據(jù)進(jìn)行分組,能夠在同一行中同時返回基礎(chǔ)行的列和聚合列伴鳖。
例如:OVET()嘁酿,PARTITION BY(),ORDER BY()
開窗函數(shù)格式: 函數(shù)名(列) OVER(選項(xiàng))
OVER 關(guān)鍵字表示把函數(shù)當(dāng)成開窗函數(shù)而不是聚合函數(shù)牙肝。SQL 標(biāo)準(zhǔn)允許將所有聚合函數(shù)用做開窗函數(shù)唉俗,使用 OVER 關(guān)鍵字來區(qū)分這兩種用法嗤朴。
注:如果 OVER 關(guān)鍵字后的括號中的選項(xiàng)為空,則開窗函數(shù)會對結(jié)果集中的所有行進(jìn)行聚合運(yùn)算虫溜。
PARTITION BY 子句:
開窗函數(shù)的 OVER 關(guān)鍵字后括號中的可以使用 PARTITION BY 子句來定義行的分區(qū)來供進(jìn)行聚合計(jì)算雹姊。與 GROUP BY 子句不同,PARTITION BY 子句創(chuàng)建的分區(qū)是獨(dú)立于結(jié)果集的衡楞,創(chuàng)建的分區(qū)只是供進(jìn)行聚合計(jì)算的容为,而且不同的開窗函數(shù)所創(chuàng)建的分區(qū)也不互相影響
ORDER BY子句:
開窗函數(shù)中可以在OVER關(guān)鍵字后的選項(xiàng)中使用ORDER BY子句來指定排序規(guī)則,而且有的開窗函數(shù)還要求必須指定排序規(guī)則寺酪。使用ORDER BY子句可以對結(jié)果集按照指定的排序規(guī)則進(jìn)行排序,并且在一個指定的范圍內(nèi)進(jìn)行聚合運(yùn)算
在網(wǎng)上還找了些常用的開窗函數(shù)替劈,如下:
row_number() over(partition by ... order by ...)
rank() over(partition by ... order by ...)
dense_rank() over(partition by ... order by ...)
count() over(partition by ... order by ...)
max() over(partition by ... order by ...)
min() over(partition by ... order by ...)
sum() over(partition by ... order by ...)
avg() over(partition by ... order by ...)
first_value() over(partition by ... order by ...)
last_value() over(partition by ... order by ...)
lag() over(partition by ... order by ...)
lead() over(partition by ... order by ...)