LeetCode-SQL-184-部门工资最高的员工
大家好,我是Peter~
本文讲解的是LeetCode-SQL的第184题目,题目名为:部门工资最高的员工
难易程度:中等
题目
Employee 表包含所有员工信息,每个员工有其对应的 Id, salary 和 department Id。
1 | +----+-------+--------+--------------+ |
Department 表包含公司所有部门的信息
1 | +----+----------+ |
编写一个 SQL 查询,找出每个部门工资最高的员工。对于上述表,您的 SQL 查询应返回以下行(行的顺序无关紧要)
1 | +------------+----------+--------+ |
解释:Max 和 Jim 在 IT 部门的工资都是最高的,Henry 在销售部的工资最高。也就是说:如果部门中存在多个人同时最高,都要显示出来。
思路
个人思路1
个人思路:找到每个部门中的最高值,再和这个最高值进行计较;如果大于等于这个最高值,那肯定是部门最高的。
1 | select |
上面子句的作用就是找到每个部门中的薪水最高值
个人思路2
思路2是先使用窗口函数根据每个部门进行排序,从而得到每个人的排名,我们再取出每个人的名次即可。
⚠️:窗口函数在Hive或者MySQL8.X才有!!!
1 | -- 每个部门最高 |
因为薪水可能有重复的,所以员工的排名可能有相同的,因此使用rank()或者dense_rank()比较适合。
通过上面的思路,我们可以变化很多花样,取出不同名次的员工:
1、取出排名前2名的员工:
1 | -- 每个部门最高 |
2、取出第一个名或者第3名的员工
1 | -- 每个部门最高 |
官方题解
官方题解中给的思路:通过两个表的直接关联,再通过in关键词的多个字段的包含关系的使用,这种in关键词前面带有多个字段的写法还是学习啦!
1 | SELECT |
参考思路1
有位作者的思路和官方给定的思路是比较类似的:
1、根据部门分组找出最高薪水
先对 DepartmentId 字段分组查询最大值,得到不同 DepartmentId 下的最大值
1 | select -- 根据部门找分组找到部门号和最大值 |
2、把步骤1中的结果当做临时表,和原来的Employee表进行关联
1 | select |
3、从步骤2的临时结果和部门Department表相关联,取出我们想要的字段;
1 | select |
参考思路2
通过谓词exists的使用:部门工资最高等价于不存在
1 | SELECT |