Hive练习题之窗口函数入门使用

原始数据( 姓名,订单时间,金额)

jack,2020-01-01,10
tony,2020-01-02,15
jack,2020-02-03,23
tony,2020-01-04,29
jack,2020-01-05,46
jack,2020-04-06,42
tony,2020-01-07,50
jack,2020-01-08,55
mart,2020-04-08,62
mart,2020-04-09,68
neil,2020-05-10,12
mart,2020-04-11,75
neil,2020-06-12,80
mart,2020-04-13,94

在hive中创建表

drop  table tb_orders ;
create  table tb_orders (
name string ,
ctime string ,
money double
)
row format delimited fields terminated by "," ;
load data local inpath "/doit16/orders.txt" into table tb_orders ;

原表内容如下:
在这里插入图片描述

问题:
1、查询用户的订单明细和总金额
2、查询在2020年4月份购买过的顾客及总人数
3、查询顾客的购买明细及月购买总额
4、上述的场景,要将cost按照日期进行累加
5、查询顾客上次的购买时间
6、查询前20%时间的订单信息
7. 补充知识点 rows between … and …

答案
1、查询用户的订单明细和总金额
解答方式一:(不用窗口函数)
先按用户名分组,聚合订单总金额,然后再和原表联合查询,主要为取出每笔订单时间,金额

select 
o1.name,o1.ctime,o1.money,o2.total_money
from
tb_orders o1
join
(select
name,
sum(money) total_money
from
tb_orders
group by name) o2
on o1.name = o2.name

查询结果如下:
在这里插入图片描述
解决方式二 :使用窗口函数sum()

select
* ,
sum(money) over(partition by name)
from
tb_orders ;

查询结果如下:
在这里插入图片描述

2、查询在2020年4月份购买过的顾客及总人数
先找出四月份购买过的用户,这里用到了substring()函数,然后再使用窗口函数,统计总人数用count()

with a as (select
distinct name
from
tb_orders 
where   substring(ctime , 0 , 7) = '2020-04' )

select
name ,
count(name) over()
from
a  ;

在这里插入图片描述

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

按月统计,这里用到了month()函数

select
*,
sum(money) over(partition by name,month(ctime))
from
tb_orders

在这里插入图片描述
4、上述的场景,要将money按照日期进行累加
按日期累加的意思是:
例如 某顾客1号消费20元,2号消费30元,3号消费15元
统计结果:
1 20
2 50
3 65

select 
* ,
sum(money) over(partition by name ,month(ctime) order by ctime ) ,
sum(money) over(partition by name  order by ctime) 
from
tb_orders ;

按日期累加,只需要添加一个order by即可
在这里插入图片描述
5、查询顾客上次的购买时间
其实就是在按用户、按时间顺序排序后,把ctime字段整个下移一格
这里用lag()函数实现

select
* ,
lag(ctime , 1, '第一次购买') over(partition by name  order by ctime)
from
tb_orders ;

查询结果:
在这里插入图片描述
6、查询前20%时间的订单信息
分析:将所有订单按时间排序,取前20%的订单信息,也就是前1/5的部分
这里可以使用ntile()函数,参数设置为5,就会将表分为5块,我们取第1块就是所需要的内容

select
name ,
ctime ,
money
from

(select
*,
ntile(5) over(order by ctime) nl
from
tb_orders)t 
where   nl = 1 
;

查询结果:
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值