暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL8.0开窗函数,分组排序小Case

原创 dr 2020-06-28
1611

leetcode题目:查看部门工资前三高的人员

Employee 表包含所有员工信息,每个员工有其对应的工号 Id,姓名 Name,工资 Salary 和部门编号 DepartmentId

雇员表 Employee

NAME VARCHAR2(10)
SALARY NUMBER(10,2)
DEP_ID VARCHAR2(40)
ID NOT NULL VARCHAR2(36)
部门表 Department

ID NOT NULL NUMBER(38)
NAME VARCHAR2(10)

ORACLE实现方式:

select tt.* from (
select t.Name,d.Name as dep_name,
(dense_rank() OVER(PARTITION BY t.dep_id ORDER BY t.Salary DESC)) RK
from Employee t left join Department d on t.dep_id=d.Id ) tt where RK<=3

image.png

ORACLE 开窗函数简要说明:

rank() over([partition by col1] order by col2)
dense_rank() over([partition by col1] order by col2)
row_number() over([partition by col1] order by col2)
其中[partition by col1]可省略。

三个分组函数都是按照col1分组内从1开始排序,区别在于:
row_number() 是没有重复值的排序(即使两条记录相等也是不重复的)
dense_rank() 是连续排序,两个第二名仍然跟着第三名
rank() 是跳跃排序,两个第二名下来就是第四名(并列第一)

总结rank() 函数相同的排名相同
dense_rank() 相同的排名后也是连续的
row_number() 无重复值
rank() 是跳跃排序,两个第二名下来就是第四名

MySQL怎么实现?

8.0就很好实现了,和ORACLE一样,MySQL同样提供了开窗函数,8.0之前就很麻烦了。
8.0以前要用变量的方式(我反正看不懂),自己查资料看去。

先试试rank() 函数部门1 pony和Henry并列第四,也就没有第5
image.png

row_number() 并列的 pony和Henry也是不同的排名

select t.*, row_number() over(PARTITION by dep_id order by salary)

as sal_order from employee t
image.png

dese_rank() 并列的排名之后也是跟着下一个排名
select t.*, dense_rank() over(PARTITION by dep_id order by salary)
as sal_order from employee t
image.png

这样要得到前三的排名就很容易了,在嵌套一层查询。

image.png

最后修改时间:2020-06-28 18:45:37
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论