【零】Hive中窗口函数(over())的实例解析
一、函数说明
- OVER():指定分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变而变化。
- CURRENT ROW:当前行
- n PRECEDING:往前n行数据
- n FOLLOWING:往后n行数据
- UNBOUNDED:起点,UNBOUNDED PRECEDING 表示从前面的起点 UNBOUNDED FOLLOWING表示到后面的终点
- LAG(col,n,default_val):往前第n行数据
- LEAD(col,n, default_val):往后第n行数据
- NTILE(n):把有序窗口的行分发到指定数据的组中,各个组有编号,编号从1开始,对于每一行,NTILE返回此行所属的组的编号。注意:n必须为int类型。
二、案例
2.1 数据
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
2.2 需求
- 查询在2017年4月份购买过的顾客及总人数
- 查询顾客的购买明细及月购买总额
- 上述的场景, 将每个顾客的cost按照日期进行累加
- 查询每个顾客上次的购买时间
- 查询前20%时间的订单信息
2.3 创建表
create table business(
name string,
orderdate string,
cost int
) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
load data local inpath "/opt/module/datas/business.txt" into table business;
2.4 题目详解
- 查询在2017年4月份购买过的顾客及总人数
select distinct name,count(*) over() zongrenshu from business where substring(orderdate,1,7) = “2017-04”;
- 查询顾客的购买明细及购买总额
*select ,sum(cost) over(partition by substring(orderdate,1,7)), sum(cost) over(partition by substring(orderdate,1,7),name) from business;
- 上述的场景, 将每个顾客的cost按照日期进行累加
*select ,sum(cost) over(partition by name order by orderdate rows between unbounded preceding and current row) leijia from business;
- 查询每个顾客上次的购买时间
select name,orderdate,cost,lag(orderdate,1,(“default”)) over(partition by name order by orderdate) last_order from business;
- 查询前20%时间的订单信息
select * from (
select name,orderdate,cost, ntile(5) over(order by orderdate) sorted from business) t
where sorted = 1;
三、补充
sum(cost) over() as sample1,--所有行相加
sum(cost) over(partition by name) as sample2,--按name分组,组内数据相加
sum(cost) over(partition by name order by orderdate) as sample3,--按name分组,组内数据累加
sum(cost) over(partition by name order by orderdate rows between UNBOUNDED PRECEDING and current row ) as sample4 ,--和sample3一样,由起点到当前行的聚合
sum(cost) over(partition by name order by orderdate rows between 1 PRECEDING and current row) as sample5, --当前行和前面一行做聚合
sum(cost) over(partition by name order by orderdate rows between 1 PRECEDING AND 1 FOLLOWING ) as sample6,--当前行和前边一行及后面一行
sum(cost) over(partition by name order by orderdate rows between current row and UNBOUNDED FOLLOWING ) as sample7 --当前行及后面所有行
四、Life
《预感》
我象一面旗帜被空旷包围,
我感到阵阵来风,我必须承受。
下面的一切还没有动静:
门轻关,烟囱无声,
窗不动,尘土还很重。
我认出风暴而激动如大海。
我舒展开来又卷缩回去,
我挣脱自身,独自
置身于伟大的风暴中。
上一篇: Bootstrap入门
下一篇: php如何判断一个字符是数字
推荐阅读
-
Python中的random.uniform()函数教程与实例解析
-
Python中的random.uniform()函数教程与实例解析
-
Hive中的去重 :distinct,group by与ROW_Number()窗口函数
-
pytorch中的nn.ZeroPad2d()零填充函数实例详解
-
Sql Server中Substring函数的用法实例解析
-
Oracle中窗口函数over()的学习
-
Hive中的去重 :distinct,group by与ROW_Number()窗口函数
-
php中解析带中文字符的url函数实例详解
-
如何调用python中的内置函数?(实例解析)
-
python中的匿名函数是什么?语法及实例解析