hive的窗口函数

1.相关函数说明

over():指定分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变化而变化;group by不可以用在over中,可以用distribut by 和 sort by 连用

CURRENT ROW:当前行; n PRECEDING:往前 n 行数据; n FOLLOWING:往后 n 行数据;

UNBOUNDED:起点,UNBOUNDED PRECEDING 表示从前面的起点, UNBOUNDED

FOLLOWING 表示到后面的终点;

所上函数在over中使用

--------------------------------------------------------------------------------

下面函数在over外使用,后面必须跟over

lag(col,n,’默认值’):往前n 行数据;

lead(col,n,’默认值’):往后n 行数据;

col表示查找哪一列;第三个参数为null时,我们也可传默认值,不传也可以。

ntile(n):把有序分区中的行分发到指定数据的组中,各个组有编号,编号从 1 开始,对于每一行,NTILE 返回此行所属的组的编号。注意:n 必须为 int 类型。

2.数据准备:nameorderdatecost ,创建hive表为business

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

3.需求:

(1)查询在 2017 年 4 月份购买过的顾客及总人数

select name,count(*) over() from business where substring(orderdate,0,7) = '2017-04' group by name;

(2)查询顾客的购买明细及购买总额

         如果over函数没有值,则是对所有数据集进行操作

select *,sum(cost) over() from business;

(3)上述的场景,要将 cost 按照日期进行累加

select *,sum(cost) over(order by orderdate) from business;

(4)查询每位顾客详情,将cost按照日期进行累加

         此时我们不可以用group by,而是用distribut by 和 sort by来进行处理

select *,sum(cost) over(distribute by name sort by orderdate) from business;

(5)查询顾客上次的购买时间

select *,lag(orderdate,1) over(distribute by name sort by orderdate) from business;

NULL说明这是第一次消费,为了使数据保持一致,我们可以在lag中添加第三个参数,也就是为NULL的默认值。

 select *,lag(orderdate,1,'1970-01-01') over(distribute by name sort by orderdate) from business;

这样我们的NULL值就被替换成默认值了

(6)查询前 20%时间的订单信息

select
name,
orderdate,
cost
from
(select
 name,
 orderdate,
 cost,
 ntile(5) over(order by orderdate) ntile
from
 business)t1
where
ntile = 1;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值