部門工資前三高的所有員工 - LeetCode


Employee 表包含所有員工信息,每個員工有其對應的工號 Id,姓名 Name,工資 Salary 和部門編號 DepartmentId 。

+----+-------+--------+--------------+
| Id | Name  | Salary | DepartmentId |
+----+-------+--------+--------------+
| 1  | Joe   | 85000  | 1            |
| 2  | Henry | 80000  | 2            |
| 3  | Sam   | 60000  | 2            |
| 4  | Max   | 90000  | 1            |
| 5  | Janet | 69000  | 1            |
| 6  | Randy | 85000  | 1            |
| 7  | Will  | 70000  | 1            |
+----+-------+--------+--------------+

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

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

編寫一個 SQL 查詢,找出每個部門獲得前三高工資的所有員工。例如,根據上述給定的表,查詢結果應返回:

+------------+----------+--------+
| Department | Employee | Salary |
+------------+----------+--------+
| IT         | Max      | 90000  |
| IT         | Randy    | 85000  |
| IT         | Joe      | 85000  |
| IT         | Will     | 70000  |
| Sales      | Henry    | 80000  |
| Sales      | Sam      | 60000  |
+------------+----------+--------+

解釋:

IT 部門中,Max 獲得了最高的工資,Randy 和 Joe 都拿到了第二高的工資,Will 的工資排第三。銷售部門(Sales)只有兩名員工,Henry 的工資最高,Sam 的工資排第二。

 

我的解答:

# Write your MySQL query statement below

select
    d.Name as Department,
    temp.Name Employee,
    temp.Salary
from
    Department d left join
    (select
        e.DepartmentId,
        e.Name,
        @curRank := if (@prevDept = DepartmentId, if(@prevSal = e.Salary, @curRank, @curRank + 1), 1) as Rank,
        @prevSal := e.Salary as Salary,
        @prevDept := e.DepartmentId
    from Employee e,
    (select @prevDept := null, @curRank := 0, @prevSal := null) t
    order by e.DepartmentId, e.Salary desc
    ) temp on d.Id = temp.DepartmentId
where temp.Rank <= 3

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/department-top-three-salaries

: )


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM