MySQL 技巧:用好窗口函数,告别复杂子查询
在日常开发中,我们经常遇到“分组排名”“累计求和”或“环比计算”等需求。以往靠子查询或临时变量实现,代码又长又难维护。MySQL 8.0 引入的窗口函数让这些操作变得优雅高效。
1. 分组排名:ROW_NUMBER()
假设要统计每位学生的成绩排名(按班级分组):
SELECT name, class, score,
ROW_NUMBER() OVER (PARTITION BY class ORDER BY score DESC) AS rank
FROM students;
PARTITION BY 指定分组,ORDER BY 决定排序规则。想允许并列名次?改用 RANK() 或 DENSE_RANK() 即可。
2. 累计求和:SUM() OVER()
计算每个月的销售额累计值:
SELECT month, amount,
SUM(amount) OVER (ORDER BY month) AS cumulative
FROM sales;
默认从第一行累加到当前行,无需自连接。
3. 环比增长率:LAG() 获取上一行
SELECT month, amount,
(amount - LAG(amount, 1) OVER (ORDER BY month)) / LAG(amount, 1) OVER (ORDER BY month) * 100 AS growth_rate
FROM revenue;
LAG(列, 偏移量) 取前几行数据,LEAD() 取后几行,轻松计算差值或比率。
小贴士
- 窗口函数不会合并行,保留原始明细
- 性能优于等价的子查询或临时表方案
- 需要 MySQL 8.0+,低版本可升级或改用模拟写法
用好窗口函数,让 SQL 更短、更清晰、更高效。