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