文章目录
- 一、窗口函数概念
- 二、语法及常用函数
- 2.1语法
- 2.2窗口函数的特征
- 2.3窗口函数的分类
- 2.3.1排序
- 2.3.2聚合
- 2.3.3分析
- 2.3.4窗口定义
一、窗口函数概念
窗口函数是一组特殊函数,通过扫描多个输入行来计算每个输出值,为每行数据生成一行结果,可以通过窗口函数来实现复杂的计算和聚合。窗口函数也称为OLAP(Online Analytical Processing)函数,是对一组值进行操作,不需要使用Group by子句对数据进行分组,还能在同一行返回原来行的列和使用聚合函数得到的聚合列。
二、语法及常用函数
2.1语法
Function (arg1,..., arg n) OVER ([PARTITION BY <...>] [ORDER BY <....>] [<window_clause>])
函数子句:指明具体操作,如sum 求和,first_value 取第一个值;
partition by子句:指明分区字段,如果没有,则将所有数据作为一个分区;
order by子句:指明了每个分区排序的字段和方式,也是可选的,没有就是按照表中的顺序;
窗口子句:指明相对当前记录的计算范围,可以向上(preceding),可以向下(following) 可以使 用between指明,上下边界的值,没有的话默认为当前分区
2.2窗口函数的特征
①聚合函数可以作为窗口函数使用
②具有计算和取值的功能
③不改变记录数
2.3窗口函数的分类
2.3.1排序
ROW_NUMBER()
对所有数值输出不同的序号,序号唯一连续
RANK()
对相同数值,输出相同的序号,下一个序号跳过(1,1,3)
DENSE_RANK()
对相同数值,输出相同的序号,下一个序号连续(1,1,2)
NLITE(n)
将有序的数据集合平均分配到n个桶中, 将桶号分配给每一行,根据桶号,选取前或后 n分之几的数据
PERCENT_RANK()
(目前排名- 1)/(总行数- 1),值相对于一组值的百分比排名
2.3.2聚合
标准聚合函数作为窗口函数配合order by使用,可以实现累积计算。注意只有计算类的窗口函数可以实现累积计算
COUNT() 计数,可以和DISTINCT一起用
SUM():求和 sum窗口函数配合order by,可以实现累计和
AVG():平均值 avg窗口函数配合order by 可以实现累计平均
MAX()/MIN(): 最大/小值 配合order by 可以实现累计最大值、最小值
从Hive 2.1.0开始在OVER子句中支持聚合函数
2.3.3分析
CUME_DIST
小于等于当前值的行数/分组内总行数
LEAD/LAG(col,n)
某一列进行往后/前第n行值(n可选,默认为1)
FIRST_VALUE
对该列到目前为止的首个值
LAST_VALUE
到目前行为止的最后一个值
2.3.4窗口定义
窗口定义由[<window_clause>]子句描述
用于进一步细分结果并应用分析函数
支持两类窗口定义
①行类型窗口
②范围类型窗口
RANK、NTILE、DENSE_RANK、CUME_DIST、PERCENT_RANK、LEAD、LAG和ROW_NUMBER函数不支持与窗口子句一起使用
2.3.4.1 行窗口:根据当前行之前或之后的行号确定的窗口
ROWS BETWEEN <start_expr> AND <end_expr>
<start_expr>可以为下列值
UNBOUNDED PRECEDING : 窗口起始位置(分组第一行)
CURRENT ROW:当前行
N PRECEDING/FOLLOWING:当前行之前/之后n行
<end_expr>可以为下列值
UNBOUNDED FOLLOWING : 窗口结束位置(分组最后一行)
CURRENT ROW:当前行
N PRECEDING/FOLLOWING:当前行之前/之后n行
2.3.4.2 范围窗口:取分组内的值在指定范围区间内的行
该范围值/区间必须是数字或日期类型
目前只支持一个ORDER BY列
RANGE BETWEEN 500 PRECEDING AND 1000 FOLLOWING
– 假设当前close值为3000,语句将包含分区内范围从值为2500到4000的行