mysql olap 函数_Mysql中的窗口函数

窗口函数初识

窗口函数也叫OLAP函数(Online Anallytical Processing,联机分析处理),可以对数据进行实时分析处理。窗口函数和group by有类似之处,其区别在于窗口会对每个分组之后的数据进行分别操作,而group by一般对分组之后的函数使用聚集函数汇总。

窗口函数进阶

mysql 8.0 之后的版本开始支持窗口函数的功能,窗口函数一般用于实现排名和Top N的问题,下面用过leetcode的几个例子来说明一下,窗口函数的用法。

Leetcode 178 (Medium)成绩排名

这个题目需要实现对成绩的排名,并且有相同分数时排名相同,但不占用下一个同学的名次。考虑使用窗口函数dense_rank():

select score, dense_rank() over(order by score desc) as "Rank" from Scores;

Leetcode 184 (Medium)部门工资最高的员工

这个题目需要找出每个分组中的最大值,可以使用group by,但是我推荐使用窗口函数dense_rank():

select ed.Department, ed.Employee, ed.Salary from

(select d.Name as Department, e.Name as Employee, e.Salary,

dense_rank() over(partition by d.Name order by e.Salary desc) as ranking

from Employee as e inner join Department as d on e.DepartmentId = d.Id) as ed

where ed.ranking = 1 order by ed.Department;

除了使用排名函数dense_rank()以外,我们还使用分组操作partition by,在每个分组中构造排名,并通过where筛选。

Leetcode 185 (Hard)部门工资前三高的所有员工

这个题目是一个Top N的问题,这里的N为3,因此我们还是使用窗口函数分组并在上一题的基础上更改筛选条件:

select Department, Employee, Salary

from (select d.Name as Department,

e.Name as Employee,

e.Salary as Salary,

dense_rank() over(partition by d.Name order by e.Salary desc) as ranking

from Employee as e inner join Department as d on e.DepartmentId = d.Id) as ed

where ed.ranking <=3;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值