SQL窗口函数入门
学习使用ROW_NUMBER、RANK、SUM等窗口函数进行分组排名、滚动计算和移动平均。 · 难度:入门 · +15XP
什么是窗口函数?
窗口函数(Window Function)可以在不改变行数的情况下,对一组相关行进行计算。它使用OVER()子句来定义窗口(即行集),并返回每个行的聚合值或排名。
1. 基本语法
SELECT name, department, salary,
ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS rank_in_dept
FROM employees;
2. 常用窗口函数
| 函数 | 作用 |
|---|---|
| ROW_NUMBER() | 为每行分配唯一连续整数 |
| RANK() | 排名,相同值并列,跳过后续排名 |
| DENSE_RANK() | 排名,相同值并列,不跳过排名 |
| SUM() OVER | 累计求和 |
| AVG() OVER | 移动平均 |
| LAG() / LEAD() | 访问前一行/后一行数据 |
3. 窗口与聚合的区别
聚合函数(如GROUP BY)会减少行数,而窗口函数保留所有行,每一行都能看到窗口内的计算结果。
4. 实际案例:部门内工资排名
SELECT name, department, salary,
RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS dept_rank
FROM employees;
5. 练习提示
写出一个查询,为每位员工计算其所在部门的累计工资占比(即该员工工资占部门总工资的百分比)。使用SUM() OVER。