题目描述
表: Employee
+--------------+---------+ | Column Name | Type | +--------------+---------+ | id | int | | name | varchar | | salary | int | | departmentId | int | +--------------+---------+ id 是该表的主键列(具有唯一值的列)。 departmentId 是 Department 表中 ID 的外键(reference 列)。 该表的每一行都表示员工的ID、姓名和工资。它还包含了他们部门的ID。
表: Department
+-------------+---------+ | Column Name | Type | +-------------+---------+ | id | int | | name | varchar | +-------------+---------+ id 是该表的主键列(具有唯一值的列)。 该表的每一行表示部门ID和部门名。
公司的主管们感兴趣的是公司每个部门中谁赚的钱最多。一个部门的 高收入者 是指一个员工的工资在该部门的 不同 工资中 排名前三 。
编写解决方案,找出每个部门中 收入高的员工 。
以 任意顺序 返回结果表。
示例
输入: Employee 表: +----+-------+--------+--------------+ | id | name | salary | departmentId | +----+-------+--------+--------------+ | 1 | Joe | 85000 | 1 | | 2 | Henry | 80000 | 2 | | 3 | Sam | 60000 | 2 | | 4 | Max | 90000 | 1 | | 5 | Janet | 69000 | 1 | | 6 | Randy | 85000 | 1 | | 7 | Will | 70000 | 1 | +----+-------+--------+--------------+ Department 表: +----+-------+ | id | name | +----+-------+ | 1 | IT | | 2 | Sales | +----+-------+ 输出: +------------+----------+--------+ | Department | Employee | Salary | +------------+----------+--------+ | IT | Max | 90000 | | IT | Joe | 85000 | | IT | Randy | 85000 | | IT | Will | 70000 | | Sales | Henry | 80000 | | Sales | Sam | 60000 | +------------+----------+--------+ 解释: 在IT部门: - Max的工资最高 - 兰迪和乔都赚取第二高的独特的薪水 - 威尔的薪水是第三高的 在销售部: - 亨利的工资最高 - 山姆的薪水第二高 - 没有第三高的工资,因为只有两名员工提示:
- 没有姓名、薪资和部门 完全 相同的员工。
思路
窗口函数 DENSE_RANK()
:
DENSE_RANK()
为每个部门内的员工按工资降序分配排名。如果有并列的工资,排名会连续分配(例如,1, 1, 2, 3)。PARTITION BY e.departmentId
:按部门分组。ORDER BY e.salary DESC
:在每个部门内按工资降序排列。
子查询 WITH RankedEmployees
:
- 使用
WITH
子句创建一个临时表RankedEmployees
,其中包含每个员工的部门、姓名、工资以及排名。
主查询:
- 从
RankedEmployees
中选择排名在前3的记录。 WHERE ranked <= 3
:确保只选择每个部门中排名前3的员工。ORDER BY Department ASC, ranked ASC
:按部门名称升序排列,同一部门内按排名升序排列。
实现
# Write your MySQL query statement below
WITH RankedEmployees AS (
SELECT
d.name AS Department,
e.name AS Employee,
e.salary AS Salary,
DENSE_RANK() OVER (
PARTITION BY e.departmentId ORDER BY e.salary DESC
) ranked
FROM
Employee e
JOIN
Department d ON e.departmentId = d.id
)
SELECT
Department,
Employee,
Salary
FROM
RankedEmployees
WHERE
ranked <= 3
ORDER BY
Department ASC,
ranked ASC;