184. 部门工资最高的员工
题目描述:Employee` 表包含所有员工信息,每个员工有其对应的 Id, salary 和 department Id。
1 | +----+-------+--------+--------------+ |
Department
表包含公司所有部门的信息。
1 | +----+----------+ |
编写一个 SQL 查询,找出每个部门工资最高的员工。对于上述表,您的 SQL 查询应返回以下行(行的顺序无关紧要)。
1 | +------------+----------+--------+ |
解释:
Max 和 Jim 在 IT 部门的工资都是最高的,Henry 在销售部的工资最高。
代码及解释:
解题思路:
先对Employee表对工资进行排序并加上序号,根据样例最大值都要输出,所以利用DENSE_RANK()的特性,特性就是对于同样大的数序号相等,所以本题就序号进行判断是否等于1即可,即序号为1就输出
扩展:
如果最大值只输出一个那就利用ROW_NUMBER(),此函数与上面函数几乎一样,唯一差别就在于,这个函数对于同样大的数,序号不相等,而是依次排列。
扩展:
RANK():这个排序是跳跃排序,比如两个第一名,序号都为1,第二名则序号为3
DENSE_RANK()为连续排序,比如两个第一名,序号都为1,则第二名序号为2
ROW_NUMBER() 是没有重复值的排序(即使两条记录相等也是不重复的),可以利用它来实现分页
解释:
partition by
答:
partition by为分析函数的一部分,并不把相同的数据合并,只把相同的数据分为一组,每项都会保留。
1 | # Write your MySQL query statement below |
练习: