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;

hive的窗口函数_第1张图片

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

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

hive的窗口函数_第2张图片

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

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

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

hive的窗口函数_第3张图片

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

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

hive的窗口函数_第4张图片

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

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

hive的窗口函数_第5张图片

这样我们的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;

你可能感兴趣的:(hive的窗口函数)