SQL面试高频题:如何查询每个部门薪资前三的员工?(大厂必考)
💡 导读
大家好,我是蔡老师。
在SQL面试中,「分组TopN问题」 是出现频率最高的考点之一,不管是数据分析、大数据开发、Java后端岗,10家公司有8家都会考。
很多同学一听到“分组+排名”就慌,其实这类题有固定解题模板,掌握了窗口函数,直接套用就能拿满分。
今天就用 「各部门薪资Top3员工」 这道最经典的题,给大家讲透分组排名的用法,看完这篇,所有TopN类问题都能秒解!
💡 文末福利:后台回复【SQL】领取《SQL面试高频50题》,窗口函数、分组TopN、连续访问题全覆盖!
🎯 面试真题
题目要求
有一张员工表 employees,包含员工ID、姓名、部门、薪资。 需求:查询出每个部门中,薪资排名前三的员工信息。
表结构
CREATE TABLE employees ( emp_id INT, -- 员工ID emp_name VARCHAR(20), -- 员工姓名 department VARCHAR(20),-- 部门 salary INT-- 薪资);
测试数据
INSERT INTO employees VALUES(1, 'Alice', '研发', 28000),(2, 'Bob', '研发', 26000),(3, 'Cindy', '研发', 25000),(4, 'David', '研发', 22000),(5, 'Eva', '运营', 20000),(6, 'Frank', '运营', 19000),(7, 'Grace', '运营', 18000),(8, 'Helen', '运营', 16000);
🔑 解题思路(3步万能模板)
这类题只有一种标准答案写法:子查询 + 窗口函数。
核心步骤
- 分区:用
PARTITION BY department 按部门分组,让每个部门单独排名; - 排序:用
ORDER BY salary DESC 按薪资从高到低排序; - 排名:用
ROW_NUMBER() 生成行号,外层筛选 <=3 即可。
✅ 标准答案(直接背)
SELECT emp_id, emp_name, department, salaryFROM (-- 子查询:给每个部门的员工生成薪资排名SELECT emp_id, emp_name, department, salary,-- 核心:按部门分区,按薪资倒序排名ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC ) AS rank_numFROM employees) t-- 外层筛选:只保留排名前三WHERE rank_num <= 3;
📊 运行结果
完美实现:每个部门只保留薪资前3名员工。
🚀 面试必问:3个排名函数区别(高频考点)
面试官一定会追问: ROW_NUMBER()、RANK()、DENSE_RANK() 有什么区别?
一句话总结
- ROW_NUMBER():连续不重复排名(1,2,3,4)
- DENSE_RANK():连续并列排名(1,2,2,3)
业务场景怎么选?
- 薪资相同算并列,且允许超过3条 → 用
RANK() - 并列不跳号,前三档都要 → 用
DENSE_RANK()
📌 面试加分回答
你可以主动跟面试官说:
“这道题是标准的分组TopN问题,最优解法是使用窗口函数。先用 PARTITION BY 按部门分组,ORDER BY 按薪资排序,再用 ROW_NUMBER() 生成行号,最后外层筛选 <=3。如果业务允许并列薪资都进入前三,我会把函数换成 RANK() 或 DENSE_RANK()。”
这段话一说,面试官直接觉得你很专业!
📢 写在最后
分组TopN是SQL面试最基础、最常考的题型,没有之一。 只要记住: PARTITION BY 分组 + ORDER BY 排序 + 排名函数 + 外层筛选 所有同类题都能秒杀!
如果这篇对你有帮助,欢迎点赞+在看,我会持续更新大厂SQL面试真题!
👉 免费领取资料
关注公众号,后台回复:【SQL】 领取《SQL面试高频50题》【HR】 领取《人事与背景调查面试题参考答案》【进群】 加入大数据面试交流群,每日真题打卡!