首页 > 数据库 > > SQL学习之窗口函数
一、什么是窗口函数
窗口函数,也叫OLAP函数(Online Anallytical Processing,联机分析处理),可以对数据库数据进行实时分析处理。
二、窗口函数的用途和使用场景
在日常工作中,经常会遇到需要在每组内排名,比如下面的业务需求:
排名问题:每个部门按业绩来排名
topN问题:找出每个部门排名前N的员工进行奖励
面对这类需求,就需要使用sql的高级功能窗口函数了。
2. 经典使用场景
(1)经典top N问题
找出每个部门排名前N的员工进行奖励
(2)经典排名问题
业务需求“在每组内排名”,比如:每个部门按业绩来排名
(3)在每个组里比较的问题
比如查找每个组里大于平均值的数据,可以有两种方法:
方法1,使用前面窗口函数案例来实现
方法2,使用关联子查询。
三、窗口函数的语法
‹窗口函数› over (partition by ‹用于分组的列名›
order by ‹用于排序的列名›)‹窗口函数›的位置,可以放以下两种函数:
2. 聚合函数,如sum. avg, count, max, min等。
四、 窗口函数的额注意事项
select *,
rank() over (order by 成绩 desc) as rankingfrom 班级表得到结果:

2. 因为窗口函数是对where或者group by子句处理后的结果进行操作,所以窗口函数原则上只能写在select子句中。
四、经典问题语法
案例使用表格

1. 经典TopN问题(经典排名问题解法类似)
/* 查询每个学生成绩最高的两门学科 按学生分组,将成绩按降序排序,取前两名,用不占用名次的row_number 从row_number里选出前两位,但是因为运行顺序,直接用where条件会报错,用子查询实现 */
select *
FROM(SELECT *,
row_number() over
(PARTITION BY 学号 ORDER BY 成绩 ) as ranking
FROM score) as a
WHERE ranking<=2;
2.组内进行比较的问题
-- 查询单科成绩高于该科目平均成绩的学生 -- 先计算每门科目的平均成绩,再进行比较 SELECT *
FROM(SELECT *, avg(成绩) over(PARTITION BY 课程号 )
AS avg_score
FROM score) AS a
WHERE 成绩>avg_score
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31537575/viewspace-3139973/ ,如需转载,请注明出处,否则将追究法律责任。