面试常考的 SQL 窗口函数汇总
面试常考的 SQL 窗口函数汇总(举例详解)
SQL 窗口函数是数据分析、数据工程师岗位面试中的高频考点。掌握它们不仅能提升 SQL 编写能力,还能在面试中展示出对数据处理的深入理解。下面是面试中最常考的窗口函数,结合典型例题和详细解析,助你轻松应对。
一、窗口函数基础语法
函数名() OVER ([PARTITION BY 列1, 列2, ...][ORDER BY 列1 [ASC|DESC], ...][ROWS/RANGE BETWEEN ...]
)
PARTITION BY
:分组,类似 GROUP BY,但不合并行。ORDER BY
:排序,决定窗口函数计算的顺序。ROWS/RANGE
:定义窗口的“范围”,如当前行前后几行。
二、面试常考窗口函数及示例
1. RANK()
功能:排名,相同值并列,后续排名跳过。
例题:按成绩排名,相同分数并列,后续名次跳过。
SELECT name,score,RANK() OVER (ORDER BY score DESC) AS rank_score
FROM students;
结果示例:
name | score | rank_score |
---|---|---|
A | 100 | 1 |
B | 100 | 1 |
C | 90 | 3 |
D | 80 | 4 |
说明:A 和 B 并列第 1,C 跳过 2,直接为 3。
2. DENSE_RANK()
功能:排名,相同值并列,后续名次不跳过。
例题:按成绩排名,相同分数并列,后续名次连续。
SELECT name,score,DENSE_RANK() OVER (ORDER BY score DESC) AS dense_rank_score
FROM students;
结果示例:
name | score | dense_rank_score |
---|---|---|
A | 100 | 1 |
B | 100 | 1 |
C | 90 | 2 |
D | 80 | 3 |
说明:A 和 B 并列第 1,C 为 2,不跳过。
3. ROW_NUMBER()
功能:生成唯一行号,不考虑相同值。
例题:按成绩排序,生成唯一序号。
SELECT name,score,ROW_NUMBER() OVER (ORDER BY score DESC) AS row_num
FROM students;
结果示例:
name | score | row_num |
---|---|---|
A | 100 | 1 |
B | 100 | 2 |
C | 90 | 3 |
D | 80 | 4 |
说明:即使分数相同,行号也唯一。
4. NTILE(n)
功能:将数据分成 n 组,每组分配一个编号。
例题:将学生按成绩分成 3 组。
SELECT name,score,NTILE(3) OVER (ORDER BY score DESC) AS ntile_group
FROM students;
结果示例:
name | score | ntile_group |
---|---|---|
A | 100 | 1 |
B | 100 | 1 |
C | 90 | 2 |
D | 80 | 3 |
说明:数据被均匀分成 3 组。
5. LAG() / LEAD()
功能:
LAG(col)
:获取当前行的前一行值。LEAD(col)
:获取当前行的后一行值。
例题:查询每个学生的前一名和后一名的成绩。
SELECT name,score,LAG(score, 1) OVER (ORDER BY score DESC) AS prev_score,LEAD(score, 1) OVER (ORDER BY score DESC) AS next_score
FROM students;
结果示例:
name | score | prev_score | next_score |
---|---|---|---|
A | 100 | NULL | 100 |
B | 100 | 100 | 90 |
C | 90 | 100 | 80 |
D | 80 | 90 | NULL |
说明:LAG 和 LEAD 分别获取前后行的值,用于同比、环比分析。
6. SUM() OVER()
功能:计算累计和。
例题:按成绩顺序计算累计总分。
SELECT name,score,SUM(score) OVER (ORDER BY score DESC) AS cum_sum
FROM students;
结果示例:
name | score | cum_sum |
---|---|---|
A | 100 | 100 |
B | 100 | 200 |
C | 90 | 290 |
D | 80 | 370 |
说明:按成绩降序计算累计和。
7. AVG() OVER()
功能:计算移动平均值。
例题:计算当前行及前一行的平均成绩。
SELECT name,score,AVG(score) OVER (ORDER BY score DESC ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS moving_avg
FROM students;
结果示例:
name | score | moving_avg |
---|---|---|
A | 100 | 100 |
B | 100 | 100 |
C | 90 | 95 |
D | 80 | 85 |
说明:窗口范围为当前行及前一行。
三、面试中常考的窗口函数题目类型
- 排名类:RANK、DENSE_RANK、ROW_NUMBER 的区别。
- 分组分桶:NTILE 分组统计。
- 同比环比:LAG、LEAD 获取前后行数据。
- 累计统计:SUM、AVG 等聚合函数与 OVER 结合。
- 移动窗口:ROWS/RANGE 定义窗口范围。
四、总结
函数名 | 功能 | 面试考点 |
---|---|---|
RANK() | 排名,跳过后续名次 | 与 DENSE_RANK、ROW_NUMBER 区别 |
DENSE_RANK() | 排名,不跳过后续名次 | 同上 |
ROW_NUMBER() | 唯一行号 | 去重、分页 |
NTILE(n) | 分组编号 | 分桶、分群 |
LAG()/LEAD() | 前后行取值 | 同比、环比分析 |
SUM()/AVG() OVER() | 累计/移动统计 | 累计和、移动平均 |
如果你有具体的面试题或数据表结构,我可以帮你定制更详细的解答和优化建议!欢迎继续提问。
以上内容由AI生成,仅供参考和借鉴