力扣184(MySQL)-部门工资最高的员工(中等)
题目:
表: Employee
表: Department
编写SQL查询以查找每个部门中薪资最高的员工。
按 任意顺序 返回结果表。
查询结果格式如下例所示。
解题思路:
方法一:窗口函数和多表联结
①先将Employee表按部门id分组,然后再按薪资进行降序排序。
②将临时表与department通过部门id连起来,然后再筛选出排名为1的相关数据。
1 # Write your MySQL query statement below 2 SELECT 3 b.name AS Department, 4 a.name AS Employee, 5 salary as Salary 6 FROM 7 ( SELECT 8 name, 9 departmentId, 10 salary, 11 dense_rank ( ) over ( 12 PARTITION BY departmentId ORDER BY salary desc ) AS rnk 13 FROM Employee 14 ) AS a 15 JOIN Department b ON a.departmentid = b.id 16 WHERE 17 a.rnk = 1;
方法二:多表联结和 IN
①先找到每个部门下的最大薪资,以部门id进行分组,作为后续的筛选条件
②将两个表通过部门id进行联结
③最后从联结的表中以第一步查找的结果为条件筛选出符合要求的部门最高的薪资。
小知识:
①窗口函数:dense_rank ( ) over ( PARTITION BY ... ORDER BY ... desc ) :相同的序号一样,下一个不同的连续数字(1,2,2,3...)
其实这里用rank()也可以,相同的序号一样,下一个不同的跳跃。(1,2,2,4...)
②sql中的内连接【交集】:inner join...on ...(简写为join...on...)
③in:可以同时in查询两个字段的不同值。