開窗函數(shù)

over在聚合函數(shù)中的使用:
一般格式:
聚合函數(shù)名(列) over(選項(xiàng))
over必須與聚合函數(shù)或排序函數(shù)一起使用娇哆,聚合函數(shù)為:
sum(),max(),min(),count(),avg()
排序函數(shù)為:
rank(),row_number(),dense_rank(),ntile()
over表示把函數(shù)當(dāng)成開窗函數(shù)而不是聚合函數(shù)涣楷,SQL標(biāo)準(zhǔn)允許將所有聚合函數(shù)用做開窗函數(shù),使用over關(guān)鍵字來區(qū)分這兩種用法盖桥。
開窗函數(shù)不需要使用group by就可以對數(shù)據(jù)進(jìn)行分組浊洞,就可以同時(shí)返回基礎(chǔ)行的列和聚合列狠裹。

開窗函數(shù)sum(*) over()病蛉,對于查詢結(jié)果的每一行都返回所有符合條件的行的條數(shù)调违,over關(guān)鍵字后的括號中還經(jīng)常添加選項(xiàng)來改變進(jìn)行聚合運(yùn)算的窗口范圍窟哺,如果over關(guān)鍵字后的括號中選項(xiàng)為空,則開窗函數(shù)會對結(jié)果集中的所有行進(jìn)行聚合運(yùn)算翰萨。

常用格式:
sum(*) over(partition by A order by B)
partition by:進(jìn)行分組脏答,得到對應(yīng)組內(nèi)的所有求和值
order by:按照B進(jìn)行排序糕殉,得到對應(yīng)組內(nèi)的累計(jì)求和值(如果B為id,兩個(gè)id相同亩鬼,則這兩個(gè)id返回的sum那一列是相同的聚合值,是累計(jì)到最后一個(gè)id對應(yīng)值的和--下面的例子會詳細(xì)說明)

order by 字段名 rows|range between 邊界規(guī)則1 and 邊界規(guī)則2
rows:表示按照行的范圍進(jìn)行范圍的定位
range:表示按照取值的范圍進(jìn)行范圍的定位
這兩種不同的定位方式主要用來處理并列排序的情況(見下面的例子)
邊界規(guī)則的可取值為:
current row--當(dāng)前行
n preceding--前n行
unbounded preceding--一直到第一條記錄
n following--后n行
unbounded following--一直到最后一條記錄
'range/rows between 邊界規(guī)則1 and 邊界規(guī)則2':用來定位聚合計(jì)算范圍阿蝶,被稱為定位框架雳锋。

eg:
1、建表

CREATE TABLE over2 (
FName VARCHAR(20),FCity VARCHAR(20),FAge INT,FSalary INT);

2羡洁、插入數(shù)據(jù)

INSERT INTO over2(FName,FCity,FAge,FSalary) VALUES
('Tom','BeiJing',20,3000),('Tim','ChengDu',21,4000),('Jim','BeiJing',22,3500),('Lily','London',21,2000),('John','NewYork',22,1000),('YaoMing','BeiJing',20,3000),('Swing','London',22,2000),('Guo','NewYork',20,2800),('YuQian','BeiJing',24,8000),('Ketty','London',25,8500),('Kitty','ChengDu',25,3000),('Merry','BeiJing',23,3500),
('Smith','ChengDu',30,3000),('Bill','BeiJing',25,2000),('Jerry','NewYork',24,3300);

3玷过、關(guān)于partition by
(1)所屬城市的人員數(shù)-按城市進(jìn)行分組聚合

SELECT
    *,
    count( * ) over ( PARTITION BY Fcity ) 
FROM
    over2;
image.png

(2)顯示每一個(gè)人員的信息、所屬城市的人員數(shù)以及同齡人的人數(shù)

SELECT
    *,
    count( * ) over ( PARTITION BY Fcity ) '所屬城市人員數(shù)',
    count( * ) over ( PARTITION BY FAge ) '所屬同齡人員數(shù)'
FROM
    over2;
image.png

在同一個(gè)SELECT語句中可以同時(shí)使用多個(gè)開窗函數(shù)筑煮,而且這些開窗函數(shù)并不會相互干擾辛蚊。
4、關(guān)于order by的詳解:
(1)查詢從第一行到當(dāng)前行的的工資總和

select FName,Fcity,FAge,FSalary,
             sum(FSalary) over(order by FSalary rows between unbounded preceding and current row) '到當(dāng)前行工資求和'
from over2;
image.png

(2)將上面的row換成range

select FName,Fcity,FAge,FSalary,
             sum(FSalary) over(order by FSalary range between unbounded preceding and current row) '到當(dāng)前行工資求和'
from over2;
image.png

結(jié)果和(1)的區(qū)別體現(xiàn)在紅框和黃框部分真仲,按照FSalary進(jìn)行排序袋马,row-按照行的范圍進(jìn)行范圍定位,所以每一行后面對應(yīng)的‘到當(dāng)前行工資求和’都不一樣秸应,都嚴(yán)格的是第一行到當(dāng)前行的累計(jì)和虑凛;range-按照取值的范圍進(jìn)行范圍定位,雖然定位框架的語法仍然是從第一行到當(dāng)前行的累計(jì)和软啼,但是由于取值的范圍:等于2000元的工資有3人桑谍,所以計(jì)算的累計(jì)為從第一條到2000元工資的最后一個(gè)人,寫在每個(gè)2000元工資的人的后面都是7000祸挪。
(3)將(2)中的定位框架省略

range between unbounded preceding and current row

上述框架是開窗函數(shù)中最常用的定位框架锣披,如果是這種框架的話,可以省略上述定位框架部分

SELECT
    FName,
    Fcity,
    FAge,
    FSalary,
    sum( FSalary ) over ( ORDER BY FSalary ) '到當(dāng)前行工資求和' 
FROM
    over2;

得到的結(jié)果和(2)的結(jié)果一樣贿条。
(4)將上面的sum()換成count()雹仿,計(jì)算工資排名


image.png

按照salary進(jìn)行排序,然后計(jì)算從第一行(unbounded preceding)到當(dāng)前行(current row)的人員的個(gè)數(shù)闪唆,相當(dāng)于計(jì)算人員的的工資水平排名盅粪。
Question:
怎么讓工資為2000元的排名都為2?--見后面排序函數(shù)的rank()和dence_rank()
5悄蕾、關(guān)于over(partition by A order by B)

select FName,Fcity,FAge,FSalary,
            sum(FSalary) over(partition by FAge order by FSalary) '同齡人的累計(jì)工資'
from over2;
image.png

over在排序函數(shù)中的使用:
一般格式:
排序函數(shù)(列) over(選項(xiàng))
排序函數(shù)為:
rank(),dense_rank(),row_number(),ntile(),lead(),lag()
1票顾、rank(),dense_rank(),row_number()的區(qū)別

select  FName,Fcity,FAge,FSalary,
              rank() over(order by FSalary desc) f_rank,
                dense_rank() over(order by FSalary desc) f_dense_rank,
                row_number() over(order by FSalary desc) f_row_number
from over2;
image.png

rank()與dense_rank()的區(qū)別:
兩者都是計(jì)算一組數(shù)值中的排序值础浮,
但是在有并列關(guān)系時(shí),dence_rank中相關(guān)等級不會跳過奠骄,rank則跳過豆同。
rank() 是跳躍排序,有兩個(gè)第二名時(shí)接下來就是第四名(同樣是在各個(gè)分組內(nèi))
dense_rank()是連續(xù)排序含鳞,有兩個(gè)第二名時(shí)仍然跟著第三名影锈。
row_number():
row_number over(partition by A order by B)
根據(jù)A分組,在分組內(nèi)根據(jù)B排序蝉绷,且得出來的值是每組內(nèi)部排序后的順序編號(組內(nèi)連續(xù)的唯一的)
其主要是‘行’的信息鸭廷,并沒有排名。row_number()必須與order by一起使用熔吗,
多用于分頁查詢辆床,比如查詢10-100個(gè)學(xué)生。

select * from
(select *,row_number() over(order by FSalary DESC) paixu from over2) r
where r.paixu between 6 and 10;
image.png

2桅狠、ntile(x)--平均分區(qū)函數(shù)

select FName,Fcity,FAge,FSalary,
             ntile(3) over(order by FSalary) 分區(qū) from over2;
image.png

3讼载、lag() over(partition by A order by B)
lead() over(partition by A order by B)
lag和lead中有三個(gè)參數(shù),lag('列名',offset,'超出記錄窗口時(shí)的默認(rèn)值')
lag和lead可以獲取中跌,按一定順序B排列的當(dāng)前行的上下相鄰若干offset的莫隔行的某個(gè)列咨堤。
lag()是向前,lead()是向后漩符。

select  FName,Fcity,FAge,FSalary,
            lag(FSalary,1,'超出') over(order by FSalary DESC) f_lag向前,
            lead(FSalary,1,'超出') over(order by FSalary DESC) f_lead向后
from over2;
image.png

參考https://www.cnblogs.com/lihaoyang/p/6756956.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末一喘,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子陨仅,更是在濱河造成了極大的恐慌津滞,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件灼伤,死亡現(xiàn)場離奇詭異触徐,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)狐赡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門撞鹉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人颖侄,你說我怎么就攤上這事鸟雏。” “怎么了览祖?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵孝鹊,是天一觀的道長。 經(jīng)常有香客問我展蒂,道長又活,這世上最難降的妖魔是什么苔咪? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮柳骄,結(jié)果婚禮上团赏,老公的妹妹穿的比我還像新娘。我一直安慰自己耐薯,他們只是感情好舔清,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著曲初,像睡著了一般体谒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上复斥,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天营密,我揣著相機(jī)與錄音,去河邊找鬼目锭。 笑死,一個(gè)胖子當(dāng)著我的面吹牛纷捞,可吹牛的內(nèi)容都是我干的痢虹。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼主儡,長吁一口氣:“原來是場噩夢啊……” “哼奖唯!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起糜值,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤丰捷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后寂汇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體病往,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年骄瓣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了停巷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡榕栏,死狀恐怖畔勤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情扒磁,我是刑警寧澤庆揪,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站妨托,受9級特大地震影響缸榛,放射性物質(zhì)發(fā)生泄漏检访。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一仔掸、第九天 我趴在偏房一處隱蔽的房頂上張望脆贵。 院中可真熱鬧,春花似錦起暮、人聲如沸卖氨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽筒捺。三九已至,卻和暖如春纸厉,著一層夾襖步出監(jiān)牢的瞬間系吭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工颗品, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留肯尺,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓躯枢,卻偏偏與公主長得像则吟,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子锄蹂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評論 2 345