LeetCode-184. 部门工资最高的员工

题目描述

表: Employee

+--------------+---------+
| 列名          | 类型    |
+--------------+---------+
| id           | int     |
| name         | varchar |
| salary       | int     |
| departmentId | int     |
+--------------+---------+
在 SQL 中,id是此表的主键。
departmentId 是 Department 表中 id 的外键(在 Pandas 中称为 join key)。
此表的每一行都表示员工的 id、姓名和工资。它还包含他们所在部门的 id。

表: Department

+-------------+---------+
| 列名         | 类型    |
+-------------+---------+
| id          | int     |
| name        | varchar |
+-------------+---------+
在 SQL 中,id 是此表的主键列。
此表的每一行都表示一个部门的 id 及其名称。

查找出每个部门中薪资最高的员工。
按 任意顺序 返回结果表。

示例

输入:
Employee 表:
+----+-------+--------+--------------+
| id | name  | salary | departmentId |
+----+-------+--------+--------------+
| 1  | Joe   | 70000  | 1            |
| 2  | Jim   | 90000  | 1            |
| 3  | Henry | 80000  | 2            |
| 4  | Sam   | 60000  | 2            |
| 5  | Max   | 90000  | 1            |
+----+-------+--------+--------------+
Department 表:
+----+-------+
| id | name  |
+----+-------+
| 1  | IT    |
| 2  | Sales |
+----+-------+
输出:
+------------+----------+--------+
| Department | Employee | Salary |
+------------+----------+--------+
| IT         | Jim      | 90000  |
| Sales      | Henry    | 80000  |
| IT         | Max      | 90000  |
+------------+----------+--------+
解释:Max 和 Jim 在 IT 部门的工资都是最高的,Henry 在销售部的工资最高。

思路

子查询

  • SELECT departmentId, MAX(salary) AS max_salary FROM Employee GROUP BY departmentId:这个子查询会为每个部门找到最高的工资,并返回部门ID和对应的最高工资。
  • 子查询的结果是一个临时表,包含每个部门的departmentId和该部门的最大工资max_salary

主查询

  • 主查询通过JOINEmployee表和Department表连接起来。
  • 使用WHERE子句来筛选那些工资等于其所在部门最大工资的员工记录。
  • WHERE (e.departmentId, e.salary) IN (...):这个条件确保只有那些工资等于其所在部门最大工资的员工记录被选中。
  • 如果某个部门有多个员工的工资相同且为该部门最高工资,这些员工都会被选中。

排序

  • 使用ORDER BY对结果进行排序,先按部门名称升序,再按工资降序。

实现

# Write your MySQL query statement below
SELECT Department.name as Department,e.name as Employee,salary as Salary
FROM Employee e JOIN Department
ON e.departmentId=Department.id
WHERE 
    (e.departmentId, e.salary) IN (
        SELECT 
            departmentId, 
            MAX(salary) AS max_salary
        FROM 
            Employee
        GROUP BY 
            departmentId
    )
ORDER BY 1 ASC, 3 DESC;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

做一个AC梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值