SQL窗口函数详解
!!!MySQL 版本低于 8.0,MySQL5.x 及更早版本完全不支持 OVER () 窗口函数语法,识别不了DENSE_RANK() OVER (...)结构,会直接报语法错误。
一、什么是窗口函数
窗口函数也叫分析函数,不改变原始表行数 ,在每行数据上开一个"窗口"(一组行范围),对窗口内数据做聚合、排序、排名计算。
区别于普通聚合函数:
- 普通聚合:多行合并成1行(group by)
- 窗口函数:计算后保留原有全部行,新增计算结果列
基础语法格式
sql
select .... () OVER (
PARTITION BY 分组字段
ORDER BY 排序字段
ROWS/RANGE 窗口范围
)
二、窗口函数分类
1. 排名类窗口函数(刷题高频)
适用场景:分组排名、取TopN、处理并列排名
| 函数 | 作用 | 特点 |
|---|---|---|
| RANK() | 排名 | 相同值同名次,跳过后续名次(1,1,3) |
| DENSE_RANK() | 密集排名 | 相同值同名次,不跳名次(1,1,2) |
| ROW_NUMBER() | 行号 | 数值相同也生成唯一序号(1,2,3) |
2. 聚合类窗口函数
常规聚合函数搭配 OVER () 就能作为窗口函数使用:
SUM / AVG / MAX / MIN / COUNT
作用:在每行展示对应分组的汇总统计结果,无需嵌套子查询关联
示例:查询每位员工所属部门的最高工资、部门薪资总和
三、窗口范围控制(ROWS / RANGE)
不手动指定范围时,窗口默认范围为当前分区全部数据;支持自定义滑动窗口
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
从分区首行到当前行,常用于累计求和场景ROWS 2 PRECEDING
取当前行 + 向上2行,组成共3行的滑动统计窗口
四、窗口函数使用注意事项
OVER ()内部的ORDER BY仅控制窗口内数据排序,不改变整体查询结果集顺序- 窗口函数无法直接放在
WHERE条件中过滤,需要通过 CTE 或子查询嵌套后筛选 PARTITION BY支持多字段分组,ORDER BY支持多字段联合排序- SQL执行先后顺序:
FROM→WHERE→GROUP BY→ 窗口函数 →SELECT→ORDER BY