可以对窗口函数之后再加条件_SQL高级功能——窗口函数的使用
可以对窗⼝函数之后再加条件_SQL⾼级功能——窗⼝函数的
使⽤
· 定义:窗⼝函数,⼜叫OLAP(Online Anallytical Processing)函数,可对数据库数据进⾏实时分析处理。
· 功能:同时分组和排序;不减少原表的⾏数(区别于聚合函数,每⾏数据都⽣成⼀个结果)
· 使⽤场景:排名问题,topN问题
· 基本语法:
<
· 窗⼝函数的位置可以放置以下两种函数:rank函数的用法
1>专⽤窗⼝函数,包括rownumber();rank();denserank()等(后⽂以这3个为例介绍)。
2 >聚合函数,如sum,avg,count,max,min等。
· ⼏种窗⼝函数的⽤法:
这部分引⽤学⽣成绩排名的班级表举例。
①rank()
将每个班按成绩排名
SELECT *,rank() OVER (PARTITION BY 班级 ORDER BY 成绩 DESC) AS ranking FROM 班级表;
②dense_rank(),row_number()的⽤法及与rank()的区别
使⽤与①中类似的句式,看⼀下三者之间的区别:
SELECT *,rank() OVER (ORDER BY 成绩 DESC) AS ranking,
dense_rank() OVER (ORDER BY 成绩 DESC) AS dense_rank,
row_number() OVER (ORDER BY 成绩 DESC) AS row_number FROM 班级表;
rank() 如果有并列名次的⾏,占⽤下⼀名次的位置;
dense_rank() 如果有并列名次的⾏,顺次排列,不占⽤下⼀名次的位置;
row_number() 顺次排序,不考虑并列名次问题。
③聚合窗⼝函数
可以明确、直观地看到截⽌到某⾏数据,统计数据是多少,同时可以看出每⾏数据对整体统计数据的影响。⽤法与专⽤窗⼝函数相同,但括号中需要指定聚合的列名。
SELECT *,sum(成绩) OVER (ORDER BY 学号) AS current_sum,
avg(成绩) OVER (ORDER BY 学号) AS current_avg,
count(成绩) OVER (ORDER BY 学号) AS current_count,
max(成绩) OVER (ORDER BY 学号) AS current_max,
min(成绩) OVER (ORDER BY 学号) AS current_min FROM 班级表;
另外,还有三种常⽤⽅式(以平均数为例):
①计算当前⾏与前n⾏(共n+1⾏)的聚合窗⼝函数
SELECT *,avg(成绩) OVER (ORDER BY 学号 ROWS n PRECEDING) AS current_avg FROM 班级表;
②计算当前⾏与之后n⾏的聚合窗⼝函数
SELECT *,avg(成绩) OVER (ORDER BY 学号 ROWS n FOLLOWING) AS current_avg FROM 班级表;
③计算当前⾏与前n1⾏、后n2⾏的聚合窗⼝函数
SELECT *,avg(成绩) OVER (ORDER BY 学号
ROWS BETWEEN n1 PRECEDING AND n2 FOLLOWING) AS current_avg FROM 班级表;
多⽤于公司业绩名单排名中,可以通过移动平均直观地看到与相邻名次业绩的平均、求和等统计数据。
注意事项:
①partition⼦句可以省略,省略时默认不指定分组(开窗列),但会因此失去窗⼝函数的功能,所有⼀般不这样使⽤;
②因为窗⼝函数是对where和group by⼦句处理后的结果进⾏操作,所以原则上只能写在
select⼦句中;
③窗⼝函数中不能嵌套使⽤窗⼝函数和聚合函数;
④专⽤窗⼝函数()为空,聚合窗⼝函数()中会写对应聚合列。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。