前言
在日常工作中,经常会遇到某条件下的 TopN 问题,比如找出每个部门排名前 N 的员工。
面对这样的问题,我此前的习惯是使用 SQL 将数据全部查出来后,再通过 Pandas 处理,但在数据量很大的情况下,从数据库获取数据本地以及本地使用 Padnas 运算时,运算压力都比较大,其实可以使用 SQL 中的窗口函数来解决。
SQL 窗口函数是什么?
窗口函数也称联机分析处理(Online Anallytical Processing, OLAP 函数),其主要作用是:
1)同时具有分组和排序的功能
2)不减少原表的行数
窗口函数的语法为:
<窗口函数> over (partition by <用于分组的列名>
order by <用于排序的列名>)
<窗口函数> 的位置,可以放以下两种函数:
1) 专用窗口函数,包括后面要讲到的
rank
,dense_rank
,row_number
等专用窗口函数。2) 聚合函数,如
sum
,avg
,count
,max
,min
等
因为窗口函数是对 where 或者 group by 子句处理后的结果进行操作,所以窗口函数原则上只能写在 select 子句中。,这句很重要,因为很多时候,窗口函数可能会与 group by 子句一同使用,不理解这句话,容易在理解上混淆。
初始化数据
MySQL 下运行下述所有逻辑
我们创建一个简单的表结构来使用一下开窗函数,表结构的创表 SQL 如下:
DROP TABLE IF EXISTS student;
CREATE TABLE student
(
id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT "学生ID",
class VARCHAR(5) NOT NULL COMMENT "学生班级"