mysql数据库(2)--窗口函数之序号函数

 一、什么是窗口函数

窗口函数也叫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;

参考资料:

https://zhuanlan.zhihu.com/p/138282683

原文地址:https://www.cnblogs.com/yif930916/p/14816580.html