M17101912355969

2021-01-15   阅读量: 661

Mysql

开窗函数

扫码加入数据分析学习群

开窗函数使用场景:返回结果在每个记录之后展示表中的所有行的同时展示计算字段或者聚合字段,主要体现在求累计值,累计占比,求环比值,看排序等

定义:基于分组(窗口),对每条记录返回执行函数后的结果

函数是在满足某种条件的记录集合上执行的特殊函数。对于每条记录都要在此窗口内执行函数,有的函数随着记录不同,窗口大小都是固定的,这种属于静态窗口;有的函数则相反,不同的记录对应着不同的窗口,这种动态变化的窗口叫滑动窗口。开窗函数的本质还是聚合运算,只不过它更具灵活性,它对数据的每一行,都使用与该行相关的行进行计算并返回计算结果;

静态窗口(窗口大小固定)函数:

lead()/ntile()/row_number()/rank()/dense_rank()/percen_rank()/cume_dist()/lag()

滑动窗口(计算窗口不固定,不同记录对应不同窗口)函数:

first_value()/last_value()/nth_value()/聚合函数

公式:其中over中的所有元素均为非必填

开窗函数([<字段名>]) over([partition by<分组字段名>] [order by <排序字段名>] [<滑动窗口>] )

开窗函数的使用:

a:指定分区,未指定排序和滑动窗口时,默认计算分区内所有行

例子:计算每个部门的平均工资

select

*,

avg(sal) over(partition by deptno) as 平均工资

from emp;

即,按照部门进行分组计算均值,未指定排序和滑动窗口,计算部门分区内的所有人的均值,结果返回至每条记录后

b:指定分区,指定排序,未指定滑动窗口,默认计算分区内的第一行到当前行,不指定滑动窗口,只要指定排序,不指定分区的情况下 也默认计算第一行到当前行

例:计算累计工资

Select

*,

Sum(sal) over(partition by deptno order by hiredate) as 累计工资

From emp;

即,按照部门(deptno)分组,按照员工入职日期(hiredate)的先后顺序进行计算部门的累计工资

c:指定分区、排序、滑动窗口时,计算滑动窗口范围内的所有行,需在滑动窗口函数中指定滑动窗口才起作用,在静态窗口函数中指定滑动窗口其计算也是按照默认的规则进行,因此在静态窗口函数中无需指定滑动窗口;

滑动窗口的指定:使用between frame_start and frame_end 函数;

frame_start/frame_end函数支持:

current row:边界是当前行

unbounded preceding:边界是分区中的第一行

unbounded following:边界是分区中的最后一行

Expr preceding:边界是分区内当前行减去expr的值

Expr following:边界是分区内当前行加上expr的值


添加CDA认证专家【维克多阿涛】,微信号:【cdashijiazhuang】,提供数据分析指导及CDA考试秘籍。已助千人通过CDA数字化人才认证。欢迎交流,共同成长!
52.1207 2 0 关注作者 收藏

评论(0)


暂无数据

推荐课程

推荐帖子