跳到内容
当前位置:首页>央企考试真题>SQL面试高频题:如何查询每个部门薪资前三的员工?(大厂必考)

SQL面试高频题:如何查询每个部门薪资前三的员工?(大厂必考)

  • 2026-11-12 14:46:59
SQL面试高频题:如何查询每个部门薪资前三的员工?(大厂必考)

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步万能模板)

这类题只有一种标准答案写法:子查询 + 窗口函数。

核心步骤

  1. 分区:用 PARTITION BY department 按部门分组,让每个部门单独排名;
  2. 排序:用 ORDER BY salary DESC 按薪资从高到低排序;
  3. 排名:用 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;

📊 运行结果

emp_id
emp_name
department
salary
1
Alice
研发
28000
2
Bob
研发
26000
3
Cindy
研发
25000
5
Eva
运营
20000
6
Frank
运营
19000
7
Grace
运营
18000

完美实现:每个部门只保留薪资前3名员工。


🚀 面试必问:3个排名函数区别(高频考点)

面试官一定会追问: ROW_NUMBER()、RANK()、DENSE_RANK() 有什么区别?

一句话总结

  • ROW_NUMBER():连续不重复排名(1,2,3,4)
  • RANK():跳跃排名(1,2,2,4)
  • DENSE_RANK():连续并列排名(1,2,2,3)

业务场景怎么选?

  1. 必须取前3个人 → 用 ROW_NUMBER()
  2. 薪资相同算并列,且允许超过3条 → 用 RANK()
  3. 并列不跳号,前三档都要 → 用 DENSE_RANK()

📌 面试加分回答

你可以主动跟面试官说:

“这道题是标准的分组TopN问题,最优解法是使用窗口函数。先用 PARTITION BY 按部门分组,ORDER BY 按薪资排序,再用 ROW_NUMBER() 生成行号,最后外层筛选 <=3。如果业务允许并列薪资都进入前三,我会把函数换成 RANK() 或 DENSE_RANK()。”

这段话一说,面试官直接觉得你很专业!


📢 写在最后

分组TopN是SQL面试最基础、最常考的题型,没有之一。 只要记住: PARTITION BY 分组 + ORDER BY 排序 + 排名函数 + 外层筛选 所有同类题都能秒杀!

如果这篇对你有帮助,欢迎点赞+在看,我会持续更新大厂SQL面试真题!

👉 免费领取资料

关注公众号,后台回复:【SQL】 领取《SQL面试高频50题》【HR】 领取《人事与背景调查面试题参考答案》【进群】 加入大数据面试交流群,每日真题打卡!

微信咨询 微信客服二维码微信扫一扫 · 添加人工客服 QQ QQ咨询 QQ咨询二维码QQ扫一扫 · 添加人工客服 帮助手册