暂无图片
暂无图片
暂无图片
暂无图片
暂无图片
MySQL8.0开窗函数,分组排序小Case
1102
3页
0次
2020-06-28
5墨值下载
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
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
row_number() 并列的 pony Henry 也是不同的排名
select t.*, row_number() over(PARTITION by dep_id order by salary)
as sal_order from employee t
dese_rank() 并列的排名之后也是跟着下一个排名
select t.*, dense_rank() over(PARTITION by dep_id order by salary)
of 3
5墨值下载
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文档的来源(墨天轮),文档链接,文档作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

关注
最新上传
暂无内容,敬请期待...
下载排行榜
Top250 周榜 月榜