返回介绍

solution / 0100-0199 / 0184.Department Highest Salary / README

发布于 2024-06-17 01:04:03 字数 3096 浏览 0 评论 0 收藏 0

184. 部门工资最高的员工

English Version

题目描述

表: 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 及其名称。

 

查找出每个部门中薪资最高的员工。
任意顺序 返回结果表。
查询结果格式如下例所示。

 

示例 1:

输入:
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 在销售部的工资最高。

解法

方法一:等值连接 + 子查询

我们可以使用等值连接,将 Employee 表和 Department 表连接起来,连接条件为 Employee.departmentId = Department.id,然后使用子查询来找到每个部门的最高工资,最后使用 WHERE 子句来筛选出每个部门中薪资最高的员工。

# Write your MySQL query statement below
SELECT d.name AS department, e.name AS employee, salary
FROM
  Employee AS e
  JOIN Department AS d ON e.departmentId = d.id
WHERE
  (d.id, salary) IN (
    SELECT departmentId, MAX(salary)
    FROM Employee
    GROUP BY 1
  );

方法二:等值连接 + 窗口函数

我们可以使用等值连接,将 Employee 表和 Department 表连接起来,连接条件为 Employee.departmentId = Department.id,然后使用窗口函数 rank(),它可以为每个部门的每个员工分配一个排名,然后我们可以选择排名为 $1$ 的行即可。

# Write your MySQL query statement below
WITH
  T AS (
    SELECT
      d.name AS department,
      e.name AS employee,
      salary,
      RANK() OVER (
        PARTITION BY d.name
        ORDER BY salary DESC
      ) AS rk
    FROM
      Employee AS e
      JOIN Department AS d ON e.departmentId = d.id
  )
SELECT department, employee, salary
FROM T
WHERE rk = 1;

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文