跳转至

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
# Write your MySQL query statement below
WITH
    T AS (
        SELECT
            emp_id,
            dept,
            DENSE_RANK() OVER (
                PARTITION BY dept
                ORDER BY salary DESC
            ) rk
        FROM Employees
    )
SELECT emp_id, dept
FROM T
WHERE rk = 2
ORDER BY 1;
1
2
3
4
5
6
7
8
9
import pandas as pd


def find_second_highest_salary(employees: pd.DataFrame) -> pd.DataFrame:
    employees["rk"] = employees.groupby("dept")["salary"].rank(
        method="dense", ascending=False
    )
    second_highest = employees[employees["rk"] == 2][["emp_id", "dept"]]
    return second_highest.sort_values(by="emp_id")

评论