概念:
1 | 我们都知道在sql中有一类函数叫做聚合函数,例如sum()、avg()、max()等等, |
窗口函数与分析函数
应用场景:
1 | 1.用于分区排序 |
窗口函数:
函数 | 返回类型 | 描述 |
---|---|---|
row_number() |
bigint |
在其分区中的当前行号,从1计 |
rank() |
bigint |
有间隔的当前行排名;与它的第一个相同行的row_number 相同 |
dense_rank() |
bigint |
没有间隔的当前行排名;这个函数计数对等组。 |
percent_rank() |
double precision |
当前行的相对排名: (rank - 1) / (总行数 - 1) |
cume_dist() |
double precision |
当前行的相对排名:(前面的行数或与当前行相同的行数)/(总行数) |
ntile(*num_buckets* integer) |
integer |
从1到参数值的整数范围,尽可能相等的划分分区。 |
lag(*value* any [, *offset* integer [, *default* any ]]) |
类型同 *value* |
计算分区当前行的前*offset* 行,返回*value* 。如果没有这样的行, 返回*default* 替代。 *offset* 和*default* 都是当前行计算的结果。如果忽略了,则*offset* 默认是1,*default* 默认是 null。 |
lead(value* any [, *offset* integer [, *default* any ]]) |
类型同*value* |
计算分区当前行的后*offset* 行, 返回*value* 。如果没有这样的行, 返回*default* 替代。 *offset* 和*default* 都是当前行计算的结果。如果忽略了,则*offset* 默认是1,*default* 默认是 null。 |
first_value(*value* any) |
类型同*value* |
返回窗口第一行的计算*value* 值。 |
last_value(*value* any) |
类型同*value* |
返回窗口最后一行的计算*value* 值。 |
nth_value(*value* any, *nth* integer) |
类型同*value* |
返回窗口第*nth* 行的计算 *value* 值(行从1计数);没有这样的行则返回 null。 |
partition by子句
1 | Over子句之后第一个提到的就是Partition By,Partition By子句也可以 |
order by子句
1 | 上述的场景,假如我们想要将cost按照月进行累加。这时我们引入order by子句。 |
子查询语句:
1 | window子句 |
实例:
先准备 一张表:
1 | hive (d6_hive)> select * from full |
用窗口函数进行累加查询:
1 | hive (d6_hive)> select |
查询结果:
1 | user month count pv1 pv2 pv3 pv4 pv5 pv6 |
详细解释:
1 | pv1: 分组内从起点到当前行的pv累积,如:A组2月的pv1=1月的pv+2月的pv, 3月=1月+2月+3月 |
先通过 partition by 分区,然后 通过 order by 选择需要按指定字段排序累加的 字段。
order by 后跟的 字段 表示 :你要按这个字段进行累加。