第3章 SQL技术面试:高频SQL题型、窗口函数、查询优化、公司侧重点
SQL是BI分析师的核心技能,也是面试中的"硬门槛"。面试官通过SQL题考察候选人的数据思维、逻辑严谨性和工程实践能力。不同公司的考察侧重点有所不同:字节跳动侧重窗口函数与海量数据优化,阿里巴巴关注数据倾斜与复杂JOIN,腾讯偏好连续行为与留存分析,美团重视业务SQL与AB测试。本章围绕三大高频板块展开:窗口函数(最核心考点)、查询优化(必备技能)、经典题型(实战演练)。
📊 高频SQL题型与考察重点
| 题型分类 | 典型问题 | 核心考点 | 难度 |
|---|---|---|---|
| 窗口函数 | ROW_NUMBER / RANK 区别 | 排序逻辑、分组 | ⭐⭐⭐ |
| 聚合查询 | GROUP BY + HAVING | 分组聚合、去重 | ⭐⭐ |
| 连续行为 | 连续登录N天 | 窗口+日期差值 | ⭐⭐⭐⭐ |
| 留存分析 | 次日/7日留存 | 自关联、窗口计算 | ⭐⭐⭐⭐ |
| 查询优化 | 慢SQL排查 | 执行计划、索引 | ⭐⭐⭐ |
| 数据倾斜 | Join倾斜处理 | 数据分布、分桶 | ⭐⭐⭐⭐⭐ |
🎯 问答卡 1 · 窗口函数:ROW_NUMBER vs RANK vs DENSE_RANK
面试问题
请解释 ROW_NUMBER()、RANK() 和 DENSE_RANK() 的区别,并举例说明各自的使用场景。
面试官考察点
- 对窗口函数底层排序逻辑的理解深度
- 能否清晰区分三个函数的差异
- 是否能在实际业务场景中正确选用
回答框架
- 定义区别:ROW_NUMBER 唯一连续编号;RANK 并列跳号;DENSE_RANK 并列不跳号
- 场景匹配:ROW_NUMBER 用于分页/去重;RANK 用于竞赛排名;DENSE_RANK 用于密集排名
- 案例说明:以成绩表 [90,90,80] 为例,三种函数输出分别为 [1,2,3]、[1,1,3]、[1,1,2]
简短示例回答
ROW_NUMBER() 为每行分配唯一编号,值相同也依次编号;RANK() 相同值排名相同但跳过后续排名号;DENSE_RANK() 相同值排名相同且不跳过。TopN 查询中常用 ROW_NUMBER() 实现每组取前 N 条,例如"每个部门工资最高的员工"。
可能追问
- 如何用三种函数实现"每个部门工资前三"?哪种更合适?
- 窗口函数中的 ORDER BY 默认排序方式是什么?NULL 值如何处理?