窗口函数(开窗函数)
窗口函数是高阶函数,分为窗口和函数两个部分,窗口是限定函数的计算范围,函数表示是计算逻辑。
1.窗口函数的语法
基本语法:
函数 + over( [partition by …] [order by …] [窗口子句] )
- over表示开窗,默认窗口大小会包含所有数据。
- partition by表示根据字段再划分一个细窗口,相同字段进入同一个细窗口里面,每个窗口之间相互独立,窗口子句对于每个细窗口独立生效。
- order by表示窗口内按什么排序,如果只有over表示直接最大窗口排序;如果有partition by每个细窗口单独排序。
- 窗口子句,可以进一步限定范围
- (rows | range) between (unbounded | [num]) preceding and ([num] preceding | current row | (unbounded | [num]) following
- (rows | range) between current row and (current row | (unbounded | [num]) following)
- (rows | range) between [num] following and (unbounded | [num]) following
示例:
rows between unbounded preceding and unbounded following
// 行的范围为上无边界到下无边界(第一行到最后一行)。
// 注:窗口函数是一行一行执行的。
2.哪些函数是窗口函数
2.1窗口函数
- lag(col,n,default_val):往前第n行数据。
- lead(col,n, default_val):往后第n行数据。
- first_value (col,true/false):当前窗口下的第一个值,第二个参数为true,跳过空值。
- last_value (col,true/false):当前窗口下的最后一个值,第二个参数为true,跳过空值。
2.2聚合函数
- max:最大值。
- min:最小值。
- sum:求和。
- avg:平均值。
- count:计数。
2.3排名分析函数
- rank:排名相同时会重复,总数不会减少。
- dense_rank:排名相同时会重复,总数会减少。
- row_number:行号。
- ntile:分组并给上组号。