如何在Oracle SQL中查询各部门薪资排名第三的员工?
如何找出各部门薪资排名第三的员工(Oracle SQL实现)
实现思路
要获取各部门薪资排名第三的员工,核心是按部门分组,给组内员工按薪资降序分配排名序号,再筛选出序号为3的记录。Oracle中可以通过窗口函数快速实现,常用的窗口函数有三种,对应不同的并列薪资处理逻辑:
ROW_NUMBER():给每条记录分配唯一序号,即使薪资相同,序号也不重复;RANK():若存在并列薪资,会跳过后续序号(例如两个员工薪资并列第一,下一个员工的序号是3);DENSE_RANK():并列薪资的员工获得相同序号,后续序号不跳过(例如两个员工并列第一,下一个员工的序号是2)。
示例SQL代码
以下是使用ROW_NUMBER()实现的正确代码(修正了原代码中缺少部门分组的问题):
SELECT * FROM ( SELECT emp_id, dept_id, salary, ROW_NUMBER() OVER (PARTITION BY dept_id ORDER BY salary DESC) rn FROM employee ) WHERE rn = 3;
代码说明
- 内层子查询:通过
PARTITION BY dept_id按部门分组,ORDER BY salary DESC让每个部门内的员工按薪资从高到低排序,ROW_NUMBER()为每条记录分配组内序号rn; - 外层查询:筛选出序号
rn = 3的记录,即为各部门薪资排名第三的员工。
关于原代码的说明
原提供的代码缺少PARTITION BY dept_id,会导致全局范围内按薪资排名,无法实现"各部门"的排名需求;同时不必要的GROUP BY子句可以移除,窗口函数本身不需要分组聚合。
内容的提问来源于stack exchange,提问作者Chandni
相关产品推荐
相关产品推荐

