該題目是leetcode上的第185題违寿,難度系數為困難萧豆。
題目
Employee 表包含所有員工信息籍救,每個員工有其對應的工號 Id胸蛛,姓名 Name污茵,工資 Salary 和部門編號 DepartmentId 。
Id | Name | Salary | DepartmentId |
---|---|---|---|
Department 表包含公司所有部門的信息葬项。
Id | Name |
---|---|
編寫一個 SQL 查詢泞当,找出每個部門獲得前三高工資的所有員工。例如民珍,根據上述給定的表襟士,查詢結果應返回:
Department | Employee | Salary |
---|---|---|
解題思路
上題的重點是每個部門前三高的工資盗飒,所以我們要獲取到每個部分前三高的工資,這時我想到了通過自定義變量排名的方式陋桂,來找出每個部門排名前三的工資逆趣。
自定義變量排名找出每個部門排名前三的工資
select
e.`Salary`,
e.`DepartmentId`,
case
when @depart = e.`DepartmentId` then @rk := @rk + 1
when @depart := e.`DepartmentId` then @rk := 1
else @rk := 1
end rak
from
(
select
`DepartmentId`,
`Salary`
from
employee
group by
`DepartmentId`,
`Salary`
order by
`DepartmentId` asc,
`Salary` desc ) e,
(
select
@depart := null,
@rk := 0) init
上述語句首先我們是按部門正序、工資倒序的方式排序章喉,然后自定義了兩個變量:
depart表示本次比較的部門ID
rk表示該部分當前工資的排名
top3.png
然后再關聯(lián)employee和Department 即可實現(xiàn)我們想要的功能汗贫,最終SQL如下:
select
d.`Name` Department,
e1.`Name` Employee ,
e1.`Salary` Salary
from
(
select
e.`Salary`,
e.`DepartmentId`,
case
when @depart = e.`DepartmentId` then @rk := @rk + 1
when @depart := e.`DepartmentId` then @rk := 1
else @rk := 1
end rak
from
(
select
`DepartmentId`,
`Salary`
from
employee
group by
`DepartmentId`,
`Salary`
order by
`DepartmentId` asc,
`Salary` desc ) e,
(
select
@depart := null,
@rk := 0) init ) ds,
employee e1,
department d
where
ds.rak <= 3
and ds.DepartmentId = e1.DepartmentId
and ds.Salary = e1.Salary
and ds.DepartmentId = d.`Id`
order by
d.`Name` asc,
e1.`Salary` desc