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

1.rows between的作用

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

2.rows between的使用

首先我们有一张如下的数据表
sidday_timesale_volume
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
1. 求当前日期销售额和后面所有日期的销售额总和。
这里就需要使用使用row between来控制范围,范围就是最后一行到当前行
sql如下:
SELECT
  sid,
  day_time,
  sales_volume,
  sum(sales_volume) over(rows between current row and unbounded following) sum_sales
FROM
t_sale_info;

-- 语法解析
rows between current row and unbounded following
/* 这里面current row就是指当前行,unbounded following就是指最后一行,
and前面和后面的关系就是范围,从and后面的到and前面,但是and前面是不可以
使用unbounded following的,这样使用是错误的*/
查询结果如下:
sidday_timesale_volumesum_sales
1162020-03-1381772.0
1152020-03-1271691.0
1142020-03-1161620.0
1132020-03-1051559.0
1122020-03-0941508.0
1112020-03-0831467.0
1102020-03-0721436.0
1092020-02-1073415.0
1082020-02-0963342.0
1072020-02-0853279.0
1062020-02-0743226.0
1052020-02-0533183.0
1042020-01-0750150.0
1042020-01-0640100.0
1032020-01-053060.0
1022020-01-042030.0
1012020-01-031010.0
    通过查询结果可以看出来,sum_salses这一列中的每一行都是后面所有行到
当前行的总和。

2.求当前日期销售额和前面所有日期的销售额总和。
这里就需要使用使用row between来控制范围,范围就是最后一行到当前行
sql如下:
SELECT
  sid,
  day_time,
  sales_volume,
  sum(sales_volume) over(rows between unbounded preceding and current row) sum_sales
FROM
t_sale_info;
-- 语法解析
rows between unbounded preceding and current row
/*这里的unbounded preceding就是第一行数据,current row就是当前行
数据,关于and前和and后的关系前面说过了这里就不细说了*/
查询结果数据如下:
sidday_timesale_volumesum_sales
1162020-03-138181.0
1152020-03-1271152.0
1142020-03-1161213.0
1132020-03-1051264.0
1122020-03-0941305.0
1112020-03-0831336.0
1102020-03-0721357.0
1092020-02-1073430.0
1082020-02-0963493.0
1072020-02-0853546.0
1062020-02-0743589.0
1052020-02-0533622.0
1042020-01-0750672.0
1042020-01-0640712.0
1032020-01-0530742.0
1022020-01-0420762.0
1012020-01-0310772.0
  通过查询结果可以看出来,sum_salses这一列中的每一行都是前面所有行到
当前行的总和。

3. 求当前日期和后面两天销售额的总和。
sql如下:
SELECT
  sid,
  day_time,
  sales_volume,
  sum(sales_volume) over(rows between current row and 2 following) sum_sales
FROM
t_sale_info;
-- 语法解析
/*current row是指当前行,2 following就是后两行数据*/
查询结果如下:
sidday_timesale_volumesum_sales
1162020-03-1381213.0
1152020-03-1271183.0
1142020-03-1161153.0
1132020-03-1051123.0
1122020-03-094193.0
1112020-03-0831125.0
1102020-03-0721157.0
1092020-02-1073189.0
1082020-02-0963159.0
1072020-02-0853129.0
1062020-02-0743126.0
1052020-02-0533123.0
1042020-01-0750120.0
1042020-01-064090.0
1032020-01-053060.0
1022020-01-042030.0
1012020-01-031010.0
  通过查询结果可以看出来,sum_salses这一列中的每一行都是后面两行到
当前行的总和。

4. 求当前日期和前一天销售额的总和。
sql如下:
SELECT
  sid,
  day_time,
  sales_volume,
  sum(sales_volume) over(rows between 1 preceding and current row) sum_sales
FROM
t_sale_info;
-- 语法解析
/*1 preceding 就是指上一行数据,current row就是指当前行数据*/
查询结果如下:
sidday_timesale_volumesum_sales
1162020-03-138181.0
1152020-03-1271152.0
1142020-03-1161132.0
1132020-03-1051112.0
1122020-03-094192.0
1112020-03-083172.0
1102020-03-072152.0
1092020-02-107394.0
1082020-02-0963136.0
1072020-02-0853116.0
1062020-02-074396.0
1052020-02-053376.0
1042020-01-075083.0
1042020-01-064090.0
1032020-01-053070.0
1022020-01-042050.0
1012020-01-031030.0
  通过查询结果可以看出来,sum_salses这一列中的每一行都是前面一行到
当前行的总和。

  通过以上几个例子可以看到,使用rows between可以很灵活的控制窗口函数
的作用范围,这个在日常业务中如果能灵活使用可以很好的加快我们的工作效率
希望对大家有所帮助。
  • 9
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值