Skip to content

Latest commit

 

History

History
164 lines (128 loc) · 3.88 KB

File metadata and controls

164 lines (128 loc) · 3.88 KB
comments difficulty edit_url tags
true
中等
数据库

English Version

题目描述

表: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 |
+--------+-----------+

解释:

  • 销售部门:
    <ul>
    	<li>最高薪水为 90000 (emp_id: 4)</li>
    	<li>第二高的薪水为 80000 (emp_id: 2, 3)</li>
    	<li>两个薪水为 80000 的雇员都被包含</li>
    </ul>
    </li>
    <li><strong>IT 部门:</strong>
    <ul>
    	<li>最高薪水为 65000 (emp_id: 6, 7)</li>
    	<li>第二高的薪水为 55000 (emp_id: 5)</li>
    	<li>只有 emp_id 为 5 的雇员被包含,因为他的薪水第二高</li>
    </ul>
    </li>
    <li><b>市场部门:</b>
    <ul>
    	<li>最高薪水为 55000 (emp_id: 9)</li>
    	<li>第二高的薪水为 50000 (emp_id: 8)</li>
    	<li>雇员 8 被包含</li>
    </ul>
    </li>
    <li><b>人力资源部门:</b>
    <ul>
    	<li>只有一个雇员</li>
    	<li>因为少于 2 个雇员,所以没有包含在结果中</li>
    </ul>
    </li>
    

解法

方法一:窗口函数

我们可以使用 DENSE_RANK() 窗口函数来为每个部门的员工按照工资降序排名,然后筛选出排名为 $2$ 的员工即可。

MySQL

# 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;

Pandas

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")