题目描述
表: 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
。
主查询:
- 主查询通过
JOIN
将Employee
表和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;