题目
表: Employee
表: Department
编写SQL查询以查找每个部门中薪资最高的员工。
按 任意顺序 返回结果表。
查询结果格式如下例所示。
示例 1:
解题思路
前置知识
1.rank() over的用法
作用:查出指定条件后的进行排名,条件相同排名相同,排名间断不连续。
2.dense_rank() over
作用:查出指定条件后的进行排名,条件相同排名相同,排名间断不连续。 说明:和rank() over 的作用相同,区别在于dense_rank() over 排名是密集连续的。
3.row_number() over
作用:查出指定条件后的进行排名,条件相同排名也不相同,排名间断不连续。 说明:这个函数不需要考虑是否并列,即使根据条件查询出来的数值相同也会进行连续排序。
注意:rank本身是个函数所以当我们取别名时要加''引号
1.我们使用窗口函数rank(),它可以根据指定的分区(partition by)和排序(order by)条件对结果集进行排名。这里的分区条件是Employee.departmentId,排序条件是salary DESC(降序排列)。它会为每个员工计算一个排名(RANKING),最高的员工排名为1。
2.还使用=用了子查询(subquery),将Employee和Department两个表连接(LEFT JOIN),并将结果命名为t。最终查询从t中选择Department、Employee和Salary三个列,并添加了一个WHERE子句,只检索排名为1的员工。
tip:
partition by departmentId:按照部门分组
order by salary:按照分组进行排名
rank() over:对指定条件排名,条件相同排名相同,排名间断不连续即1,1,3,4,5,5,7
代码实现
# Write your MySQL query statement below
SELECTDepartment,Employee,Salary
FROM(SELECTDepartment.name as Department,Employee.name as Employee,salary as Salary,rank() over(partition by Employee.departmentId ORDER BY salary DESC) as RANKINGFROMEmployeeLEFT JOINDepartmentONdepartmentId = Department.id) t
WHERE RANKING = 1
测试结果