LeetCode(数据库)- 部门工资前三高的所有员工
Posted Lux_Sun
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
)
;
以上是关于LeetCode(数据库)- 部门工资前三高的所有员工的主要内容,如果未能解决你的问题,请参考以下文章