hive 窗口函数练习

这篇博客详细介绍了Hive窗口函数的使用,通过四套练习题,涵盖了统计用户数据、计算购买行为、成绩排名以及访问量等多种场景,重点讲解了聚合函数如avg()、sum(),以及排名函数row_number()、rank()、dense_rank(),并展示了lag()和lead()函数在分析数据时的应用。
摘要由CSDN通过智能技术生成
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()一起使用的开窗函数
  1. 聚合类

    avg()、sum()、max()、min()

  2. 排名类

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

  3. 其他类

    lag(列名,往前的行数,[行数为null的默认值,不指定为null])
    lead(列名,往后的行数,[行数为null的默认值,不指定为null])

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值