首页 > 数据库 > > SQL高级查询窗口函数
又叫OLAP函数,Online Anallytical Processing,联机分析处理,可以对数据库数据进行实时分析处理。窗口代表范围。
<窗口函数> over (
partition by <用于分组的列>
order by <用于排序的列名>
)<窗口函数>的位置,可以放以下两种函数:
窗口函数是对where或者group by子句处理后的结果进行操作,所以窗口函数原则上只能写在select子句中。
专用窗口函数rank
功能:
partiton by将数据按要求分组,order by再在组内进行排序
2. 不减少原表的行数
相比于group by,rank函数不会改变分组生成表的行数;
而group by生成的表格,每组数据只有一行,所以会改变行数。
其他专用窗口函数
rank, dense_rank , row_ number三者区别

注意这三种窗口函数后的( )保持空即可
典型案例
-- 典型题1:排名问题 按成绩排名,如果两个分数相同,排名要是并列的
select *,dense_rank() over (order by 成绩 desc) as dese_rank from 班级表;
万能模板:要求查询出每组内的最大N个数据
select * from (select *,row_number () over (partition by
<分组的列名> order by <排序的列名> desc)as ranking from 表名)as a
where ranking <= N;与专用窗口函数用法完全一致,将窗口函数替换成聚合函数即可,但是聚合函数后的()内不为空,而是填入指定聚合的列名。
聚合函数的作用是对自身以及自身记录之上的所有数据作函数处理。
这样就可以直观地实时观测截止到某一行的数据情况,也可以看出每一行数据对整体结果的影响。
-- 查找单科成绩高于该科目平均成绩的学生名单
select * from (
select * ,avg(成绩) over( partition by 科目 )as avg_score from 各科成绩表 )as b
where 成绩>avg_score;
窗口函数的移动平均
select *,avg(成绩)over (order by 学号 rows 2 preceding)as current_avg from 班级表;rows和preceding这两个关键字,代表 之前...行
上面语句就是之前2行,即所得结果是自身记录及前2行的平均

通过调整preceding即可调整作用范围,在公司业绩排名中,查看与相邻名词业绩的平均、求和等统计时很有用处。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31537575/viewspace-3149205/ ,如需转载,请注明出处,否则将追究法律责任。