(LeetCode:数据库)部分工资最高的员工

Employee 表包含所有员工信息,每个员工有其对应的 Id, salary 和 department Id。

+----+-------+--------+--------------+
| Id | Name  | Salary | DepartmentId |
+----+-------+--------+--------------+
| 1  | Joe   | 70000  | 1            |
| 2  | Henry | 80000  | 2            |
| 3  | Sam   | 60000  | 2            |
| 4  | Max   | 90000  | 1            |
+----+-------+--------+--------------+

Department 表包含公司所有部门的信息。

+----+----------+
| Id | Name     |
+----+----------+
| 1  | IT       |
| 2  | Sales    |
+----+----------+

编写一个 SQL 查询,找出每个部门工资最高的员工。例如,根据上述给定的表格,Max 在 IT 部门有最高工资,Henry 在 Sales 部门有最高工资。

+------------+----------+--------+
| Department | Employee | Salary |
+------------+----------+--------+
| IT         | Max      | 90000  |
| Sales      | Henry    | 80000  |
+------------+----------+--------+

Solution 1 :

SELECT
    b. NAME AS department,
    a. NAME AS employee,
    a.salary
FROM
    employee a
JOIN department b ON a.departmentId = b.id
WHERE
    (a.salary, a.departmentId) IN (
        SELECT
            max(salary),
            departmentId
        FROM
            employee
        GROUP BY
            departmentId
    )

该解法,通过分组后,max(salary) 获取最大salary, 最后 通过 salary,departmentId 确定 部门里工资最高的员工。

**Solution 2 **

SELECT
    b.`name` AS department,
    a.`name` AS Employee,
    a.salary
FROM
    (
        SELECT
            NAME,
            salary,
            departmentId
        FROM
            employee
        ORDER BY
            salary DESC
    ) a
LEFT JOIN department b ON a.departmentId = b.id
GROUP BY
    departmentId;

该解法

  1. order by salary desc 作排序,作为临时表
  2. 巧妙的利用group by 分组 获取该分组 工资最高的员工

思考:
如果IT 部门,最高工资90000,有两名同事,这两种解法 如何呢?有什么差异

你可能感兴趣的:((LeetCode:数据库)部分工资最高的员工)