MySQL 8.0 及以上版本支持丰富的窗口函数,用于在查询结果的特定窗口范围内执行计算。以下是所有窗口函数的详细讲解,结合示例说明其用法和实际应用场景。
一、窗口函数基础语法
sql
复制
<窗口函数>([参数]) OVER (
[PARTITION BY 分区列]
[ORDER BY 排序列]
[ROWS | RANGE 窗口框架]
)
- PARTITION BY:将数据划分为多个分区,每个分区独立计算。
- ORDER BY:定义窗口内数据的排序方式。
- 窗口框架(可选):限定计算范围(如
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
)。
二、核心窗口函数详解与示例
1. 排名函数
ROW_NUMBER()
- 功能:为每行分配唯一序号,序号从1开始递增。
- 示例:按部门分区,按工资降序排名。
sql
复制
SELECT department, name, salary, ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS rank FROM employees;
RANK()
- 功能:相同值排名相同,后续排名跳跃。
- 示例:处理并列第一的情况。
sql
复制
SELECT department, name, salary, RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank FROM employees; -- 结果可能:1, 2, 2, 4(两