oracle 开窗函数_MySQL开窗函数, 分组排序小Case

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< span="">

27a31060f9d8281b3b809789d8f73aae.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

4503be91f879c5332cdfe22111f149c7.png

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

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

 as sal_order from employee t

a21173e3b2e8a89e891bfdb394fcbe50.png

dese_rank()  并列的排名之后也是跟着下一个排名

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

  as sal_order from employee t

a75322470f3e997bdb897e6ab6d64dfd.png

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

8127ff60d0e8b04a220ed98448fcc6b9.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值