leetcode -數據庫 - 185. 部門工資前三高的所有員工 dense_rank(),mysql

      
      原題:https://leetcode-cn.com/problems/department-top-three-salaries/
      我自己做leetcode的數據庫題目的解題記錄:
              解題目錄 https://blog.csdn.net/weixin_42845682/article/details/105196004
      這道題很有意思,建議參考一下: 184. 部門工資最高的員工
            https://blog.csdn.net/weixin_42845682/article/details/105437193

      突然發現,這道題在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 的工資排第二。

答案:

第一種答案

      根據題目描述和參考的那篇文章,直接把使用dense_rank()的sql抄過來,把最後的=1換成 <=3 就完事。

select
    dname department,
    ename employee,
    salary 
from(
select
    d.name dname,
    e.name ename,
    e.salary,
    dense_rank() over(partition by d.name order by salary desc) row_num 
from employee e 
join department d on e.departmentId=d.id 
) tmp
where row_num <=3 

      爲什麼執行的這麼慢呢?
在這裏插入圖片描述

第二種答案

      萬一用的是mysql,不支持dense_rank()咋辦呢?(聽說mysql8.0支持over()了。)

select
    d.name Department,
    e.name Employee,
    e.salary Salary 
from employee e
join department d on e.departmentid = d.id
where 3>
(
    select 
        count(distinct(e2.salary))
    from employee e2 
    where e.departmentid=e2.departmentid
    and e2.salary > e.salary
)

       一開始寫的時候,where後面的篩選條件寫成了3>=…,結果出現了部門前四高的工資,一時半會有點沒想通。後來想通了:假設部門前三高是30000,20000,10000,那麼比30000高的只有0個,那麼比20000高的只有1個,那麼比10000高的只有2個。

select
    d.name Department,
    e.name Employee,
    e.salary Salary 
from employee e
join department d on e.departmentid = d.id
where 3>=
(
    select 
        count(distinct(e2.salary))
    from employee e2 
    where e.departmentid=e2.departmentid
    and e2.salary >= e.salary
)

      雖然這兩個sql基本一模一樣,但我還是喜歡這種寫法。。。
      ps:希望我永遠不用寫這種sql。
      
      
      

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章