開窗函數(shù)的詳細用法
一浴讯,開窗函數(shù)的語法
開窗函數(shù)的語法為:over(partition by 列名1 order by 列名2 ),括號中的兩個關鍵詞partition by 和order by 可以只出現(xiàn)一個沫浆。over() 前面是一個函數(shù),如果是聚合函數(shù)胎署,那么order by 不能一起使用逮矛。
二,從聚合開窗函數(shù)sum(score) over(partition by name )講起
sum(score) over(partition by name )
sum()是聚合函數(shù)定血,其實我聚合函數(shù)還沒學明白赔癌,當 sum()函數(shù) 后面跟上 over()以后,由sum聚合函數(shù)就成為了開窗函數(shù)澜沟。
over() 括號里面就是定義窗口的內容了灾票,partition 是分區(qū),分組的意思。partition by 就是根據(jù)某個字段分組茫虽。
所以sum(score) over(partition by name ) 刊苍,就是先根據(jù) name 分組,當前面加了sum(score)后就把根據(jù)那么分組后的席噩,每個(組)窗口里面的字段 score進行求和操作。
select *,sum(score) over(partition by name) sum窗口函數(shù)舉例
from kchs
-- 為了簡單就只有兩個字段贤壁,name和score
聚合函數(shù)同樣需要對數(shù)據(jù)進行排序悼枢,但不會顯示排名結果。會將當前名次的數(shù)據(jù) 與 排在這之前的所有數(shù)據(jù) 依次做相應的計算脾拆。
執(zhí)行語句:
select *,
sum(score) over (order by id) as 累加求和
from kchs
拓展一下:
一馒索,很多聚合函數(shù)都可以用作窗口函數(shù)的運算莹妒,如SUM、AVG绰上、MAX旨怠、MIN、COUNT蜈块。
二鉴腻,和graup by 不同的是窗口函數(shù)會生成多行,而不是想graup by 一樣只有一行
三百揭,開窗函數(shù)之first_value爽哎,last_value,lead器一,lag
first_value:是在窗口里面取到第一個值
first_value(score) over( partition by name)as first_score ,
-- 根據(jù)name分區(qū)(組)课锌,取score列的第一個值
last_value:是在窗口里面取到最后一個值
last_value(score) over(partition by name) as last_score
-- 根據(jù)name分區(qū)(組),取score列的最后一個值
lead 是取當前行的上 N 條數(shù)據(jù)祈秕,并且可以設置默認值
lead(score,1,0) over(partition by name ) as lead_score
-- 根據(jù)name分區(qū)(組)渺贤,score列當前行的上面N行,请毛,如果沒有就為默認值0
lag 是取當前行的下 N 條數(shù)據(jù)志鞍,并且可以設置默認值
lag(score,1,0) over(partition by name ) as lag_score
--根據(jù)name分區(qū)(組),score列當前行的下面N行获印,如果沒有就為默認值0
四述雾,排名開窗函數(shù)ROW_NUMBER、DENSE_RANK兼丰、RANK
row_number ()是為每組的行設置一個連續(xù)的遞增的數(shù)字(123456)
ROW_NUMBER() over( partition by name order by score asc)as ROW_NUMBER_score
rank()是排名玻孟,也為每一組的行生成一個序號,如果有相同的值會生成相同的序號,并且接下來的序號是不連序的鳍征。例如:有三個人并列第一名黍翎,第四名序號為四(111456)
rank() over(partition by name order by score asc) as RANK_score
DENSE_RANK()和RANK()類似,不同的是如果有相同的序號艳丛,那么接下來的序號不會間斷匣掸。例如:有三個人并列第一,第四名序號為2(111234)
DENSE_RANK() over(partition by name order by score asc) as DENSE_RANK_score
注意:
一氮双,排名開窗函數(shù)可以單獨使用ORDER BY 語句碰酝,也可以和PARTITION BY同時使用。
二戴差,ORDER BY 指定排名開窗函數(shù)的順序送爸,在排名開窗函數(shù)中必須使用ORDER BY語句。
三,PARTITION BY用于將結果集進行分組袭厂,開窗函數(shù)應用于每一組墨吓。