SQL窗口函数:强大的数据分析利器
学习使用ROW_NUMBER、RANK、SUM OVER等窗口函数进行高级数据分析 · 难度:入门 · +15XP
什么是窗口函数?
窗口函数(Window Function)在保留原始行数据的同时,对行集合(窗口)进行聚合或排序计算。与GROUP BY不同,它不会减少行数,而是为每一行附加计算值。
基本语法
函数名() OVER (
[PARTITION BY 列名] -- 分组,可选
[ORDER BY 列名] -- 排序,可选
[ROWS/RANGE 行范围] -- 窗口范围,可选
)常用窗口函数
| 函数 | 功能 |
|---|---|
| ROW_NUMBER() | 为每行分配唯一序号,从1开始 |
| RANK() | 排名,并列时跳过后续序号 |
| DENSE_RANK() | 排名,并列时不跳过序号 |
| SUM()/AVG()/MAX() | 窗口内的聚合计算 |
| LAG()/LEAD() | 访问当前行前/后行数据 |
实战:部门内薪资排名
SELECT name, dept_id, salary,
ROW_NUMBER() OVER (PARTITION BY dept_id ORDER BY salary DESC) AS row_num,
RANK() OVER (PARTITION BY dept_id ORDER BY salary DESC) AS rank,
DENSE_RANK() OVER (PARTITION BY dept_id ORDER BY salary DESC) AS dense_rank
FROM employees;移动平均计算
SELECT sale_date, amount,
AVG(amount) OVER (ORDER BY sale_date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS moving_avg_3day
FROM daily_sales;计算当前行及前两行的平均销售额,实现3日移动平均。
练习提示
- 找出每个产品类别中销量排名前三的产品
- 计算每个用户每次购买与上一次购买的金额差值(使用LAG)
- 计算累计销售额(使用SUM OVER ORDER BY)