SQL窗口函数

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)

不手动指定范围时,窗口默认范围为当前分区全部数据;支持自定义滑动窗口

  1. ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
    从分区首行到当前行,常用于累计求和场景
  2. ROWS 2 PRECEDING
    取当前行 + 向上2行,组成共3行的滑动统计窗口

四、窗口函数使用注意事项

  1. OVER () 内部的 ORDER BY 仅控制窗口内数据排序,不改变整体查询结果集顺序
  2. 窗口函数无法直接放在 WHERE 条件中过滤,需要通过 CTE 或子查询嵌套后筛选
  3. PARTITION BY 支持多字段分组,ORDER BY 支持多字段联合排序
  4. SQL执行先后顺序:FROMWHEREGROUP BY → 窗口函数 → SELECTORDER BY