hive中控制窗口范围rows between的使用

1.rows between的作用

在使用hsql完成一些业务需求的时候,我们经常会用到窗口函数,某些场景
下会涉及到需要控制窗口函数的范围来满足业务需求,这个时候就需要用到rows
between了,使用rows between可以根据自己的需求任意的控制窗口函数的范围。

2.rows between的使用

首先我们有一张如下的数据表

sidday_timesale
1012020-01-0310
1022020-01-0420
1032020-01-0530
1042020-01-0640
1042020-01-0750
1052020-02-0533
1062020-02-0743
1072020-02-0853
1082020-02-0963
1092020-02-1073
1102020-03-0721
1112020-03-0831
1122020-03-0941
1132020-03-1051
1142020-03-1161
1152020-03-1271
1162020-03-1381

2.1 准备数据 

vim sale_year_month

101,2020-01-03,10
102,2020-01-04,20
103,2020-01-05,30
104,2020-01-06,40
104,2020-01-07,50
105,2020-02-05,33
106,2020-02-07,43
107,2020-02-08,53
108,2020-02-09,63
109,2020-02-10,73
110,2020-03-07,21
111,2020-03-08,31
112,2020-03-09,41
113,2020-03-10,51
114,2020-03-11,61
115,2020-03-12,71
116,2020-03-13,81

2.2 创建表,导入数据

create database test;

use test;

set hive.exec.mode.local.auto=true;

create external table sales_year_month(
 sid string,
 day_time string, 
 sale int
)
row format delimited fields terminated by ',' STORED AS TEXTFILE;

load data local inpath '/home/bigdataservice/load_data_from_kafka/sales_year_month.txt' into table sales_year_month;


2.3 实战需求

2.3.1 求当前日期销售额和后面所有日期的销售额总和。

这里就需要使用使用row between来控制范围,范围就是最后一行到当前行

sql如下:
# 语句一
SELECT
  sid,
  day_time,
  sale,
  sum(sale) over(rows between current row and unbounded following) sum_sales
FROM
sales_year_month;

-- 语法解析
rows between current row and unbounded following
/* 这里面current row就是指当前行,unbounded following就是指最后一行,
and前面和后面的关系就是范围,从and后面的到and前面,但是and前面是不可以
使用unbounded following的,这样使用是错误的*/


# 语句二, 这种更好一些,因为题目隐含了需要按日期排序,所以语句指定按日期排序
SELECT
  sid,
  day_time,
  sale,
  sum(sale) over(order by day_time ASC) sum_sales
FROM
sales_year_month;

查询结果如下:

sidday_timesalesum_sales
1012020-01-0310772
1022020-01-0420762
1032020-01-0530742
1042020-01-0640712
1042020-01-0750672
1052020-02-0533622
1062020-02-0743589
1072020-02-0853546
1082020-02-0963493
1092020-02-1073430
1102020-03-0721357
1112020-03-0831336
1122020-03-0941305
1132020-03-1051264
1142020-03-1161213
1152020-03-1271152
1162020-03-138181

通过查询结果可以看出来,sum_salses这一列中的每一行都是后面所有行到
当前行的总和。

2.3.2.求当前日期销售额和截止到当前日期日期的销售额总和。

这里就需要使用使用row between来控制范围,范围就是最后一行到当前行
sql如下:

# 语句一
SELECT
  sid,
  day_time,
  sale,
  sum(sale) over(rows between unbounded preceding and current row) sum_sales
FROM
sales_year_month;
-- 语法解析
rows between unbounded preceding and current row
/*这里的unbounded preceding就是第一行数据,current row就是当前行
数据,关于and前和and后的关系前面说过了这里就不细说了*/

# 语句二, 这种更好一些,因为题目隐含了需要按日期排序,所以语句指定按日期排序
SELECT
  sid,
  day_time,
  sale,
  sum(sale) over(order by day_time DESC) sum_sales
FROM
sales_year_month;

查询结果数据如下:

sidday_timesale_volumesum_sales
1012020-01-031010
1022020-01-042030
1032020-01-053060
1042020-01-0640100
1042020-01-0750150
1052020-02-0533183
1062020-02-0743226
1072020-02-0853279
1082020-02-0963342
1092020-02-1073415
1102020-03-0721436
1112020-03-0831467
1122020-03-0941508
1132020-03-1051559
1142020-03-1161620
1152020-03-1271691
1162020-03-1381772

通过查询结果可以看出来,sum_salses这一列中的每一行都是前面所有行到
当前行的总和。

2.3.3 求当前日期和后面两天销售额的总和。

sql如下:

SELECT
  sid,
  day_time,
  sale,
  sum(sale) over(rows between current row and 2 following) sum_sales
FROM
sales_year_month;
-- 语法解析
/*current row是指当前行,2 following就是后两行数据*/

查询结果如下:

sidday_timesalesum_sales
1012020-01-031060
1022020-01-042090
1032020-01-0530120
1042020-01-0640123
1042020-01-0750126
1052020-02-0533129
1062020-02-0743159
1072020-02-0853189
1082020-02-0963157
1092020-02-1073125
1102020-03-072193
1112020-03-0831123
1122020-03-0941153
1132020-03-1051183
1142020-03-1161213
1152020-03-1271152
1162020-03-138181

通过查询结果可以看出来,sum_salses这一列中的每一行都是后面两行到
当前行的总和。

2.3.4. 求当前日期和前一天销售额的总和。

sql如下:

SELECT
  sid,
  day_time,
  sale,
  sum(sale) over(rows between 1 preceding and current row) sum_sales
FROM
sales_year_month;
-- 语法解析
/*1 preceding 就是指上一行数据,current row就是指当前行数据*/

查询结果如下:

sidday_timesalesum_sales
1012020-01-031010
1022020-01-042030
1032020-01-053050
1042020-01-064070
1042020-01-075090
1052020-02-053383
1062020-02-074376
1072020-02-085396
1082020-02-0963116
1092020-02-1073136
1102020-03-072194
1112020-03-083152
1122020-03-094172
1132020-03-105192
1142020-03-1161112
1152020-03-1271132
1162020-03-1381152

通过查询结果可以看出来,sum_salses这一列中的每一行都是前面一行与
当前行的总和。

总结

通过以上几个例子可以看到,在已经按按照要求排好序的情况下,使用rows between可以很灵活的控制窗口函数的作用范围, 否则应当在over窗口内指定排序字段,这个在日常业务中如果能灵活使用可以很好的加快我们的工作效率
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值