hive 窗口函数练习
第一套练习
1、使用 over() 函数进行数据统计, 统计每个用户及表中数据的总数
2、求用户明细并统计每天的用户总数
3、计算从第一天到现在的所有 score 大于80分的用户总数
4、计算每个用户到当前日期分数大于80的天数
测试数据
20191020,11111,85
20191020,22222,83
20191020,33333,86
20191021,11111,87
20191021,22222,65
20191021,33333,98
20191022,11111,67
20191022,22222,34
20191022,33333,88
20191023,11111,99
20191023,22222,33
建表并导入数据
-- 建表
create table test_window
(logday string,
userid string,
score int)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
-- 加载数据
load data local inpath '文件路径' into table test_window;
1、使用 over() 函数进行数据统计, 统计每个用户及表中数据的总数
select *,count(userid) over() total from test_window
2、求用户明细并统计每天的用户总数
select *,count(userid) over(partition by logday) day_tatal from test_window
3、计算从第一天到现在的所有 score 大于80分的用户总数
select *,count(userid) over(partition by logday rows between unbounded preceding and current row) as total from test_window where score > 80
4、计算每个用户到当前日期分数大于80的天数
select *,count()over(partition by userid order by logday rows between unbounded preceding and current row) as total from test_window where score > 80 order by logday,userid
第二套练习
1、查询在2017年4月份购买过的顾客及总人数
2、查询顾客的购买明细及月购买总额
3、查询顾客的购买明细及到目前为止每个顾客购买总金额
4、查询顾客上次的购买时间----lag()over()偏移量分析函数的运用
5、查询前20%时间的订单信息
测试数据
jack,2017-01-01,10
tony,2017-01-02,15
jack,2017-02-03,23
tony,2017-01-04,29
jack,2017-01-05,46
jack,2017-04-06,42
tony,2017-01-07,50
jack,2017-01-08,55
mart,2017-04-08,62
mart,2017-04-09,68
neil,2017-05-10,12
mart,2017-04-11,75
neil,2017-06-12,80
mart,2017-04-13,94
建表并导入数据
-- 建表
create table business(
name string,
orderdate string,
cost int
)ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
-- 加载数据
load data local inpath "文件路径" into table business;
1、查询在2017年4月份购买过的顾客及总人数
select *,count(1) over() as total from business where sunstr(orderdate,1,7) = '2017-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) total_amount from business;
4、查询顾客上次的购买时间----lag()over()偏移量分析函数的运用
select name,orderdate,cost,lag(orderdate,1) over(partition by name order by orderdate) lastdate from business;
5、查询前20%时间的订单信息
select * from (select *,ntile(5)over(order by orderdate)sortgroup_num from business) t where t.sortgroup_num = 1
第三套练习
1、每门学科学生成绩排名(是否并列排名、空位排名三种实现)
2、每门学科成绩排名top n的学生
测试数据
name subject score
孙悟空 语文 87
孙悟空 数学 95
孙悟空 英语 68
大海 语文 94
大海 数学 56
大海 英语 84
宋宋 语文 64
宋宋 数学 86
宋宋 英语 84
婷婷 语文 65
婷婷 数学 85
婷婷 英语 78
建表并导入数据
create table score(name string,subject string,score int) row format delimited fields terminated by "\t";
-- 加载数据
load data local inpath '文件路径' into table score;
1、每门学科学生成绩排名(是否并列排名、空位排名三种实现)
select *,
row_number() over(partition by subject order by score desc) rn1,
rank() over(partition by subject order by score desc) rn2,
dense_rank() over(partition by subject order by score desc) rn3
from score;
2、每门学科成绩排名top n的学生
select * from
(select *,
row_number() over(partition by subject order by score desc) rn
from score) t
where t.rn < 3;
第四套练习
1、求出每名用户的月累积访问量以及到当前月的总访问量
测试数据
u01,2017/1/21,5
u02,2017/1/23,6
u03,2017/1/22,8
u04,2017/1/20,3
u01,2017/1/23,6
u02,2017/2/21,8
u02,2017/1/23,6
u01,2017/2/22,4
要求显示结果
+-----------+------------+----------+-------------+--+
| userid | visitdate | vd_count | total_count | |
+-----------+------------+----------+-------------+--+
| u01 | 2017-01 | 11 | 11 | |
| u01 | 2017-02 | 4 | 15 | |
| u02 | 2017-01 | 12 | 12 | |
| u02 | 2017-02 | 8 | 20 | |
| u03 | 2017-01 | 8 | 8 | |
| u04 | 2017-01 | 3 | 3 | |
+-----------+------------+----------+-------------+--+
建表并导入数据
create table user_table(
userId string,
visitDate string,
visitCount int)
row format delimited fields terminated by ',';
-- 加载数据
load data local inpath '文件路径' into table user_table;
1、求出每名用户的月累积访问量以及到当前月的总访问量
-- 先把日期进行格式化
select userId,date_format(regexp_replace(visitDate,'/','-' ),'yyyy-MM') visitdate,visitCount from user_table --t1
-- 按照 userid 和 日期进行分组 求出每个用户的月访问量
select userId,visitDate,sum(visitCount) vd_count from t1 --t2
-- 按照用户分区,日期升序 求出每个用户的总访问量
select *,sum(vd_count) over(partition by userid order by visitdate) from t2;
常与over()一起使用的开窗函数
-
聚合类
avg()、sum()、max()、min()
-
排名类
row_number() 按照值排序时产生一个自增编号,不会重复(如:1、2、3、4、5、6)
rank() 按照值排序时产生一个自增编号,值相等时会重复,会产生空位(如:1、2、3、3、5、6)
dense_rank() 按照值排序时产生一个自增编号,值相等时会重复,不会产生空位(如:1、2、3、3、4、5) -
其他类
lag(列名,往前的行数,[行数为null的默认值,不指定为null])
lead(列名,往后的行数,[行数为null的默认值,不指定为null])