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

解题思路参考代码中的注释:
# Write your MySQL query statement below

# 本题需要使用到第180题(https://leetcode-cn.com/problems/consecutive-numbers/)的解题思路
# 首先,对Employee表根据DepartmentId升序、Salary降序进行排序
# 然后就可以用第180题的方法给同一个部门的工资进行排名,并取出各个部门前三名的工资
# 最后再与Department表进行连接查询即可

# 5. 将排好名的员工表与部门表进行连接查询,并筛选出排在前三名的记录
SELECT
    dep.Name Department,
    ranked.Name Employee,
    ranked.Salary Salary
FROM (
    # 3. 用第180题的方法给同一个部门的工资进行排名
    SELECT
        Name, DepartmentId, Salary,

        # 4.1. 如果部门名称和上一个部门名称不同,则工资排名为1
        # 4.2. 如果部门名称和上一个部门名称相同,则看工资是否相同,相同则工资排名仍为cnt,否则为cnt+1
        @cnt:=IF(@preD=DepartmentId, IF(@preS=Salary, @cnt, @cnt+1), 1) cnt,
    
        @preD:=DepartmentId preD, @preS:=Salary preS
    FROM

        # 1. 对Employee表根据DepartmentId升序、Salary降序进行排序
        (SELECT * FROM Employee ORDER BY DepartmentId, Salary DESC) sorted,

        # 2. 为了给工资进行排名,需要额外定义这三个变量,它们分别表示上一个部门名称、上一个工资、工资排名
        (SELECT @preD:=null, @preS:=null, @cnt:=0) vars
    ) ranked, Department dep
WHERE
    ranked.DepartmentId = dep.Id AND cnt <= 3;
全部评论

相关推荐

03-06 18:20
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务