该题目是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表示该部分当前工资的排名
然后再关联employee和Department 即可实现我们想要的功能,最终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
网友评论