Use of rows between to control the window range in hive

1. The role of rows between

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

2. The use of rows between

首先我们有一张如下的数据表
sid day_time sale_volume
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
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的,这样使用是错误的*/
查询结果如下:
sid day_time sale_volume sum_sales
116 2020-03-13 81 772.0
115 2020-03-12 71 691.0
114 2020-03-11 61 620.0
113 2020-03-10 51 559.0
112 2020-03-09 41 508.0
111 2020-03-08 31 467.0
110 2020-03-07 21 436.0
109 2020-02-10 73 415.0
108 2020-02-09 63 342.0
107 2020-02-08 53 279.0
106 2020-02-07 43 226.0
105 2020-02-05 33 183.0
104 2020-01-07 50 150.0
104 2020-01-06 40 100.0
103 2020-01-05 30 60.0
102 2020-01-04 20 30.0
101 2020-01-03 10 10.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后的关系前面说过了这里就不细说了*/
查询结果数据如下:
sid day_time sale_volume sum_sales
116 2020-03-13 81 81.0
115 2020-03-12 71 152.0
114 2020-03-11 61 213.0
113 2020-03-10 51 264.0
112 2020-03-09 41 305.0
111 2020-03-08 31 336.0
110 2020-03-07 21 357.0
109 2020-02-10 73 430.0
108 2020-02-09 63 493.0
107 2020-02-08 53 546.0
106 2020-02-07 43 589.0
105 2020-02-05 33 622.0
104 2020-01-07 50 672.0
104 2020-01-06 40 712.0
103 2020-01-05 30 742.0
102 2020-01-04 20 762.0
101 2020-01-03 10 772.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就是后两行数据*/
查询结果如下:
sid day_time sale_volume sum_sales
116 2020-03-13 81 213.0
115 2020-03-12 71 183.0
114 2020-03-11 61 153.0
113 2020-03-10 51 123.0
112 2020-03-09 41 93.0
111 2020-03-08 31 125.0
110 2020-03-07 21 157.0
109 2020-02-10 73 189.0
108 2020-02-09 63 159.0
107 2020-02-08 53 129.0
106 2020-02-07 43 126.0
105 2020-02-05 33 123.0
104 2020-01-07 50 120.0
104 2020-01-06 40 90.0
103 2020-01-05 30 60.0
102 2020-01-04 20 30.0
101 2020-01-03 10 10.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就是指当前行数据*/
查询结果如下:
sid day_time sale_volume sum_sales
116 2020-03-13 81 81.0
115 2020-03-12 71 152.0
114 2020-03-11 61 132.0
113 2020-03-10 51 112.0
112 2020-03-09 41 92.0
111 2020-03-08 31 72.0
110 2020-03-07 21 52.0
109 2020-02-10 73 94.0
108 2020-02-09 63 136.0
107 2020-02-08 53 116.0
106 2020-02-07 43 96.0
105 2020-02-05 33 76.0
104 2020-01-07 50 83.0
104 2020-01-06 40 90.0
103 2020-01-05 30 70.0
102 2020-01-04 20 50.0
101 2020-01-03 10 30.0
  通过查询结果可以看出来,sum_salses这一列中的每一行都是前面一行到
当前行的总和。

  通过以上几个例子可以看到,使用rows between可以很灵活的控制窗口函数
的作用范围,这个在日常业务中如果能灵活使用可以很好的加快我们的工作效率
希望对大家有所帮助。

Guess you like

Origin blog.csdn.net/AnameJL/article/details/112863893