184. 部门工资最高的员工(SQL)

一、题目描述

Employee 表包含所有员工信息,每个员工有其对应的 Id, salary 和 department Id。
±—±------±-------±-------------+
| 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 |
±—±---------+
编写一个 SQL 查询,找出每个部门工资最高的员工。对于上述表,您的 SQL 查询应返回以下行(行的顺序无关紧要)。
±-----------±---------±-------+
| Department | Employee | Salary |
±-----------±---------±-------+
| IT | Max | 90000 |
| IT | Jim | 90000 |
| Sales | Henry | 80000 |
±-----------±---------±-------+
解释:
Max 和 Jim 在 IT 部门的工资都是最高的,Henry 在销售部的工资最高。

二、题解
方法一:使用rank开窗函数和join语句

# Write your MySQL query statement below
select
t2. Name as Department,
t1.Name as Employee,
t1.Salary as Salary
from
(select 
    DepartmentId,
    Name,
    Salary,
    rank() over(partition by DepartmentId order by Salary desc) as rk
from Employee) t1 join Department t2 on t1.DepartmentId = t2.Id
where t1.rk = 1;

方法二:使用in和join

SELECT
    Department.Name AS Department,
    Employee.Name AS Employee,
    Employee.Salary
FROM 
    Employee JOIN Department ON Employee.DepartmentId = Department.Id
WHERE (Employee.DepartmentId,Employee.Salary) IN
 (SELECT
    DepartmentId, MAX(Salary)
FROM
    Employee
GROUP BY DepartmentId);

注意语法:

WHERE (Employee.DepartmentId,Employee.Salary) IN
 (SELECT
    DepartmentId, MAX(Salary)
FROM
    Employee
GROUP BY DepartmentId);

猜你喜欢

转载自blog.csdn.net/qq_38748148/article/details/113355081