hive的窗口函数

1、hive窗口函数语法

语法

hive中的窗口函数over() ,over()窗口函数的语法结构
分析函数 over(partition by 列名 order by 列名 rows between 开始位置 and 结束位置)
over()函数中包括三个函数: 包括partition by 列名,排序order by 列名、指定窗口范围rows between 开始位置 and 结束位置。我们在使用over()窗口函数时,over()函数中的这三个函数可组合使用也可以不使用。


over()函数中的三个函数讲解
order by
order by是排序的意思,是该窗口中的.
partition by
partition by可理解为group by 分组。over(partition by 列名)搭配分析函数时,分析函数按照每一组每一组的数据进行计算的。
rows between 开始位置 and 结束位置
是指定窗口范围,比如第一行到当前行。而这个范围是随着数据变化的。over(rows between 开始位置 and 结束位置)搭配分析函数时,分析函数按照这个范围进行计算的。
窗口范围说明:
我们常使用的窗口范围是ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW(表示从起点到当前行),常用该窗口来计算累加。

PRECEDING:往前
FOLLOWING:往后
CURRENT ROW:当前行
UNBOUNDED:起点(一般结合PRECEDING,FOLLOWING使用)
UNBOUNDED PRECEDING 表示该窗口最前面的行(起点)
UNBOUNDED FOLLOWING:表示该窗口最后面的行(终点)
比如说:
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW(表示从起点到当前行)
ROWS BETWEEN 2 PRECEDING AND 1 FOLLOWING(表示往前2行到往后1行)
ROWS BETWEEN 2 PRECEDING AND 1 CURRENT ROW(表示往前2行到当前行)
ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING(表示当前行到终点)

2、常与over()一起使用的分析函数:

聚合类

avg(),sum(),max(),min()

排名类

row_number() 按照值排序时产生一个自增编号,不会重复(如:1、2、3、4、5、6)
rank() 按照值排序时产生一个自增编号,值相等时会重复,会产生空位(如:1、2、3、3、3、6)
dense_rank() 按照值排序时产生一个自增编号,值相等时会重复,不会产生空位(如:1、2、3、3、3、4)

其他类

lag (列名,往前的行数,[行数为null时的默认值,不指定为null]),可以计算用户上次购买时间,或者用户下次购买时间
lead (列名,往后的行数,[行数为null时的默认值,不指定为null])
ntile(n) 把有序分区中的行分发到指定数据的组中,各个组有编号,编号从1开始,对于每一行,ntile返回此行所属的组的编号

案例

需求
1、查询在2020年4月份购买过的顾客及总人数
2、查询顾客的购买明细及月购买总额
3、查询顾客的购买明细及到目前为止每个顾客购买总金额
4、查询顾客上次的购买时间
5、查询前20%时间的订单信息

字段说明:

用户名订单日期订单金额
nameorderdatecost

数据:

jack,2020-01-01,11
tony,2020-01-02,16
jack,2020-02-03,22
tony,2020-01-04,28
jack,2020-01-05,47
jack,2020-04-06,43
tony,2020-01-07,50
jack,2020-01-08,55
mart,2020-04-08,63
mart,2020-04-09,69
tom,2020-05-10,13
mart,2020-04-11,76
tom,2020-06-12,81
mart,2020-04-13,95

建表并导入数据:

create table business
(
name string,
orderdate string,
cost int
)ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘,’;

加载数据

load data local inpath “/export/data/hive/business.txt” into table business;

1、查询在2020年4月份购买过的顾客及总人数

select ,count() over() as total from business where substr(orderdate,1,7) = ‘2020-04’;

2、查询顾客的购买明细及月购买总额

select *,sum(cost) over(partition by name,substr(orderdate,1,7)) total_amount
from business;

3、查询顾客的购买明细及到目前为止每个顾客购买总金额

select *,sum(cost) over(partition by name order by orderdate
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) total_amount
from business;

4、查询顾客上次的购买时间

select name,orderdate,cost,lag(orderdate,1) over(partition by name order by orderdate) last_date
from business;

5、查询前20%时间的订单信息

select *
from
(select *,
ntile(5)over(order by orderdate) group_num from business) t
where t. group_num = 1;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值