开窗函数名([<字段名>]) over([partition by <分组字段>] [order by <排序字段> [desc]] [<窗口分区>])
对于滑动窗口的范围指定,通常使用 between frame_start and frame_end 语法来表示行范围,frame_start和frame_end可以支持如下关键字,来确定不同的动态行记录:
current row 边界是当前行,一般和其他范围关键字一起使用
unbounded preceding 边界是分区中的第一行
unbounded following 边界是分区中的最后一行
expr preceding 边界是当前行减去expr的值
expr following 边界是当前行加上expr的值
移动平均可用来消除差额较大的情况,平滑数据
和基于行类似,但有些范围不是直接可以用行数来表示的,比如希望窗口范围是一周前的订单开始,截止到当前行,则无法使用rows来直接表示,此时就可以使用范围来表示窗口:interval 7 day preceding。
如没有指定排序和滑动窗口范围,默认计算的是分区内的所有记录。 指定分区和排序后,如没有指定滑动窗口范围,默认计算的是分区内的第一行到当前行。
不管是否指定滑动窗口范围,窗口都是固定的,所以指定的滑动窗口范围无效。
函数名显示内容显示样式row_number()显示分区中不重复不间断的序号1,2,3,4...dense_rank()显示分区中重复不间断的序号1,1,2,3,3...rank()显示分区中重复间断的序号1,1,3,4...
其中,rank为rank()函数产生的序号,rows为当前窗口的记录总行数。
rank() over(partition by user_no order by amount desc) rank1,
percent_rank() over(partition by user_no order by amount desc) percent
示例:查询大于等于当前订单金额的订单比例
rank() over(partition by user_no order by amount desc) rank1,
cume_dist() over(partition by user_no order by amount desc) cume
分区中位于当前行前n行(lag)/后n行(lead)的记录值
示例:查询上一个订单距离当前订单的间隔天数
lag(create_date,1) over(partition by user_no order by create_date) last_date
分区中的第一个/最后一个指定参数的值
示例:查询截止到当前订单,按照日期排序第一个订单和最后一个订单的订单金额
first_value(amount) over(partition by user_no order by create_date) first_amount,
last_value(amount) over(partition by user_no order by create_date) last_amount
nth_value(amount,2) over(partition by user_no order by amount) second_amount,
nth_value(amount,3) over(partition by user_no order by amount) third_amount
2. nfile(n):将分区中的有序数据分为n个桶,记录桶号
示例:将每个用户的订单按照订单金额分成3组
此函数在数据分析中应用较多,比如由于数据量大,需要将数据平均分配到N个并行的进程分别计算,此时就可以用nfile(n)对数据进行分组,由于记录数不一定被n整除,所以数据不一定完全平均,然后将不同桶号的数据再分配。