1.rows between的作用

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

2.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可以很灵活的控制窗口函数
的作用范围,这个在日常业务中如果能灵活使用可以很好的加快我们的工作效率
希望对大家有所帮助。