开窗函数使用场景:返回结果在每个记录之后;展示表中的所有行的同时展示计算字段或者聚合字段,主要体现在求累计值,累计占比,求环比值,看排序等
① 定义:基于分组(窗口),对每条记录返回执行函数后的结果
函数是在满足某种条件的记录集合上执行的特殊函数。对于每条记录都要在此窗口内执行函数,有的函数随着记录不同,窗口大小都是固定的,这种属于静态窗口;有的函数则相反,不同的记录对应着不同的窗口,这种动态变化的窗口叫滑动窗口。开窗函数的本质还是聚合运算,只不过它更具灵活性,它对数据的每一行,都使用与该行相关的行进行计算并返回计算结果;
静态窗口(窗口大小固定)函数:
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的值








暂无数据