美文网首页
185-部门工资前三高的所有员工_leetcode

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

作者: 尘世的鱼 | 来源:发表于2020-03-26 21:50 被阅读0次

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

          本文链接:https://www.haomeiwen.com/subject/kjvhuhtx.html