185-部门工资前三高的所有员工_leetcode

该题目是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

然后再关联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

你可能感兴趣的:(185-部门工资前三高的所有员工_leetcode)