一、什么是窗口函数
窗口函数也叫OLAP函数(Online Anallytical Processing,联机分析处理),可以对数据进行联机分析处理。
常见窗口函数的分类如上图所示,本节主要介绍窗口函数中的序号函数类。
二、窗口函数语法
select 窗口函数() over (partition by 用于分组的类别,order by 用于排序的列名)
三、序号函数类的作用
1、解决排名问题,如对每个班级按成绩进行排名
2、解决TopX的问题,如每个班级前X名的学生
四、序号函数类的用法
1、rank()
1 #按班级分类,将成绩降序排序 2 SELECT*, 3 rank() over ( PARTITION BY 班级 ORDER BY 成绩 DESC) AS ranking 4 FROM class;
(1)rank()是排序函数,括号中不需要有参数;
(2)通过partition by将班级分类,相当于之前用过的group by子句功能,但是group by子句分类汇总会改变原数据的行数,而用窗口函数自救保持原行数。
2、dense_rank(),row_number()的用法与rank()相同,它们之间的区别在于:
以查询班级成绩为例,当出现成绩相同的情形时,
(1)在rank()函数,如果有并列情况,会占用下一个名次的位置,比如,成绩为100的学生有三个并列第一,那么99分的学生是第二名,通过rank()函数,名次是:1,1,1,4;
(2)dense_rank()函数中,如果有并列的情况,不会占用下一个名词,同用上个例子,名次是:1,1,1,2;
(3)在row_number()函数中,会忽略并列的情况,同用上述例子,名次是:1,2,3,4.
附录:TopN问题的模板
1 SELECT * 2 FROM (SELECT*,row_number() over (PARTITION BY 姓名 ORDER BY 成绩 DESC) AS ranking 3 FROM test1) AS newtest 4 WHERE ranking<=N;
参考资料: