天天看點

LeetCode:Department Top Three Salaries -各部門工資最高的三人

1、題目名稱

department top three salaries(各部門工資最高的三個人)

2、題目位址

3、題目内容

表employee儲存了所有雇員的資料,每名雇員都有一個id,和一個部門id(departmentid)

表department儲存了每個部門的id和名稱

現需要寫一個sql,找出每個部門工資最高的三名雇員。例如以上面的兩張表的資料,查詢出的結果集應該是這樣的:

4、初始化資料庫腳本

在mysql資料庫中建立一個名為leetcode的資料庫,用mysql指令行中的source指令執行下面腳本:

5、解題sql

先寫一個sql,查詢出每個有部門的人的部門和工資

select d.name dep, e.name emp, e.salary sal

from employee e

left join department d on e.departmentid = d.id

where d.name is not null

使用 mysql query browser 工具查詢結果如下:

LeetCode:Department Top Three Salaries -各部門工資最高的三人

根據這個sql,可以繼續寫出一個查詢出每個部門工資處于前三名位置的員工清單:

這個sql的查詢結果集如下:

LeetCode:Department Top Three Salaries -各部門工資最高的三人

可以看到,部門4(dprt4)有四個人,一個高工資(wkk,75000),一個低工資(kmt,55000),其他兩個人工資(jyy,xwy,60000)是一樣的。按照上面的sql,會查出該部門工資最高的三個人是wkk、jyy、xwy,我認為這是一種合理的結果,即:

查出每個部門工資排名最靠前的三個人,如有多于三人工資并列第一則将這些人都查出,如有多于兩人工資并列第二則查出排名第一的人和這些并列第二的人,如有多于一人工資并列第三則查出排名第一、二名的人和所有并列第三名的人。

但這種類似計算長跑比賽前三名的算法卻并不是本題的“正确答案”,本題實際上要我們找的并不是要你求出每個部門工資最高的三個人,而是要:

先求出每個部門第三高的工資,再求出該部門工資數不小于第三高工資的所有雇員。

雖然我認為這是不合理的答案,不過還是寫了一個“正确”的sql如下:

查詢出的結果集如下:

LeetCode:Department Top Three Salaries -各部門工資最高的三人

另一種更簡單的sql寫法如下,查詢結果集與上同: