Hive窗口函数练习题

每个用户截止到每月为止的最大单月访问次数和累计到该月的总访问次数

0: jdbc:hive2://node03:10000> create table view_log(
. . . . . . . . . . . . . . > name string,
. . . . . . . . . . . . . . > time string,
. . . . . . . . . . . . . . > views int)
. . . . . . . . . . . . . . > row format delimited fields terminated by ',';

0: jdbc:hive2://node03:10000> load data local inpath '/root/view_log' into table view_log;
# 数据
A,2015-01,5
A,2015-01,15
B,2015-01,5
A,2015-01,8
B,2015-01,25
A,2015-01,5
A,2015-02,4
A,2015-02,6
B,2015-02,10
B,2015-02,5
A,2015-03,16
A,2015-03,22
B,2015-03,23
B,2015-03,10
B,2015-03,11

# 期望结果
用户  月份      最大访问次数  总访问次数       当月访问次数
A     2015-01          33              33               33
A     2015-02          33              43               10
A     2015-03          38              81               38
B     2015-01          30              30               30
B     2015-02          30              45               15
B     2015-03          44              89               44
select 
	name,time,
	-- 使用窗口分析函数进行比较,从每个分区第一行开始比较,第一行最大值为自己,下移到第二行,将第二行和第一行作比较,获取较大值,往下同理
	max(month_views) over(partition by name order by time rows between unbounded preceding and current row) max_views,
	-- 使用窗口分析函数进行向下累加,从第一行开始,第一行累加得到自己,到第二行,将第一行和第二行相加得到结果,向下同理
	sum(month_views) over(partition by name order by time rows between unbounded preceding and current row) month_view_add,
	month_views 
from 
	-- 第一步使用group by按照用户名和日期聚合求出单月的总额作为子表
	(select name,time,sum(views) month_views from view_log group by name,time) tb1

你可能感兴趣的:(Hive)