3338. 第二高的薪水 II 🔒
题目描述
表:employees
+------------------+---------+ | Column Name | Type | +------------------+---------+ | emp_id | int | | salary | int | | dept | varchar | +------------------+---------+ emp_id 是这张表的唯一主键。 这张表的每一行包含雇员信息,包括他们的 ID,薪水和部门。
编写一个解决方案来找到每个部门中 薪水第二高 的雇员。如果 有多个雇员有第二高的薪水,在结果中包含所有获得该薪水的雇员。
返回结果表以 emp_id
升序 排序。
结果格式如下所示。
示例:
输入:
employees 表:
+--------+--------+-----------+ | emp_id | salary | dept | +--------+--------+-----------+ | 1 | 70000 | Sales | | 2 | 80000 | Sales | | 3 | 80000 | Sales | | 4 | 90000 | Sales | | 5 | 55000 | IT | | 6 | 65000 | IT | | 7 | 65000 | IT | | 8 | 50000 | Marketing | | 9 | 55000 | Marketing | | 10 | 55000 | HR | +--------+--------+-----------+
输出:
+--------+-----------+ | emp_id | dept | +--------+-----------+ | 2 | Sales | | 3 | Sales | | 5 | IT | | 8 | Marketing | +--------+-----------+
解释:
- 销售部门:
- 最高薪水为 90000 (emp_id: 4)
- 第二高的薪水为 80000 (emp_id: 2, 3)
- 两个薪水为 80000 的雇员都被包含
- IT 部门:
- 最高薪水为 65000 (emp_id: 6, 7)
- 第二高的薪水为 55000 (emp_id: 5)
- 只有 emp_id 为 5 的雇员被包含,因为他的薪水第二高
- 市场部门:
- 最高薪水为 55000 (emp_id: 9)
- 第二高的薪水为 50000 (emp_id: 8)
- 雇员 8 被包含
- 人力资源部门:
- 只有一个雇员
- 因为少于 2 个雇员,所以没有包含在结果中
解法
方法一:窗口函数
我们可以使用 DENSE_RANK()
窗口函数来为每个部门的员工按照工资降序排名,然后筛选出排名为 $2$ 的员工即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
1 2 3 4 5 6 7 8 9 |
|