LeetCode(数据库)- 部门工资前三高的所有员工

题目链接:点击打开链接

 

题目大意:略。

 

解题思路:

  • 解决方案(1):因为题目说最多 3 个,所以从最里面的子查询到最外面子查询开始,分别获取 MAX 薪水并且要排除掉上一次最高的薪水,这样从里到外子查询薪水依次排名:1、2、3名次;结尾只要包含其中一列的 S* 说明就在这排名范围内。这里尤其注意 GROUP BY 的时候,一定要对最里面的子查询的部门 Id 进行分组,因为很有可能,只有一条记录,根本没排名 2、3,这样的话对当前子查询进行部门 Id 分组的话,此时该部门 Id 为 null,就会出问题。
  • 解决方案(2):在解决方案(1)的基础上,里面 3 个子查询走完其实长这样的,如图所示(当然这里的 S3/D3 为 null 是因为我的案例只有最多到排名 2 就结束了)



    其实到这里可以转成 S/D 两列,这样的话到时候外围 SELECT 只要用 IN 语法就可以大功告成了,但是这里目前只想到 UNION ALL 语法进行拼接,而且很麻烦,效率低,因为要对 3 个子查询进行每次的 UNION ALL,所以这里不推荐,但是这个思路还是可以跟大伙分析下哈~
  • 解决方案(3):根据 部门 (升)薪水 (降) 顺序查询出每个部门的员工薪水进行排序,注意这里的 CASE WHEN THEN 语法后面虽然没 BREAK 但是默认有该作用,所以哪怕第一个 WHEN 通过后,也不会走第二个 WHEN
  • 解决方案(4):公司里前 3 高的薪水意味着有不超过 3 个工资比这些值大

 

AC 代码

  • 解决方案(1)
SELECT de. NAME Department, em. NAME Employee, em.Salary
FROM Employee em
JOIN Department de ON em.DepartmentId = de.Id,
 (
	SELECT MAX(Salary) S3, S2, S1, D
	FROM Employee e1
	RIGHT JOIN (
		SELECT MAX(Salary) S2, S1, D
		FROM Employee e0
		RIGHT JOIN (
			SELECT MAX(Salary) S1, DepartmentId D
			FROM Employee
			GROUP BY DepartmentId
		) rs1 ON e0.DepartmentId = rs1.D AND e0.Salary <> rs1.S1
		GROUP BY D
	) rs2 ON e1.DepartmentId = rs2.D AND e1.Salary <> rs2.S1 AND e1.Salary <> rs2.S2
	GROUP BY D
) rs3
WHERE de.Id = rs3.D AND (em.Salary = rs3.S1 OR em.Salary = rs3.S2 OR em.Salary = rs3.S3)
  • 解决方案(2)
UNION ALL
  • 解决方案(3)
SELECT dep.Name Department, emp.Name Employee, emp.Salary
FROM (
        SELECT te.DepartmentId, te.Salary,
               CASE 
                    WHEN @pre = DepartmentId THEN @rank:= @rank + 1
                    WHEN @pre := DepartmentId THEN @rank:= 1
               END AS `RANK`
        FROM (SELECT @pre:=null, @rank:=0) tt,
             (
                 SELECT DepartmentId,Salary
                 FROM Employee
                 GROUP BY DepartmentId,Salary
                 ORDER BY DepartmentId,Salary DESC
             ) te
       ) t
INNER JOIN Department dep ON t.DepartmentId = dep.Id
INNER JOIN Employee emp ON t.DepartmentId = emp.DepartmentId and t.Salary = emp.Salary and t.RANK <= 3
  • 解决方案(4)
SELECT
    d.Name AS 'Department', e1.Name AS 'Employee', e1.Salary
FROM
    Employee e1
        JOIN
    Department d ON e1.DepartmentId = d.Id
WHERE
    3 > (SELECT
            COUNT(DISTINCT e2.Salary)
        FROM
            Employee e2
        WHERE
            e2.Salary > e1.Salary
                AND e1.DepartmentId = e2.DepartmentId
        )
;
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陆氪和他的那些代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值