我的SQL查询是:
SELECT time, buy,
avg(buy) OVER (ORDER BY time rows between 1 preceding and current row) as average_2,
avg(buy) OVER (ORDER BY time rows between 2 preceding and current row) as average_3
FROM my_table;
我试图了解这些窗口功能。我使用了一些测试数据并得到了结果:
TIME BUY AVERAGE_2 AVERAGE_3
------------------- ---------- ---------- ----------
2019-05-05 10:05:19 1 1 1
2019-05-05 10:05:22 2 1.5 1.5
2019-05-05 10:05:25 3 2.5 2
2019-05-05 10:05:27 4 3.5 3
我需要知道:如何获得这些结果?特别是average_3
?
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
和rows between 2 preceding and current row
有什么区别?我从互联网上阅读了很多解释,现在我很困惑,因为它们用不同的语法解释了。
答案 0 :(得分:1)
对于第一行(最早的时间),没有前面的行,因此between 1 preceding and current row
和between 2 preceding and current row
都只实际找到当前行。因此,两个平均值都是单个值1的平均值,当然是1。
对于第二行,只有前一行,因此between 1 preceding and current row
和between 2 preceding and current row
都只能实际找到当前行(2)和该前一行(1)。因此,两个平均值都是相同的两个值2和1的平均值,即1.5(即(2 + 1)/ 2)。
对于第三行,现在有前两行。这次:
between 1 preceding and current row
找到当前行(3)和紧邻的前一行(2),并且该平均值计算为(3 + 2)/ 2,即2.5。前面的所有较早的行都会被忽略,因此计算中不包含1。between 2 preceding and current row
找到当前行(3)和前两个行(2和1),并且该平均值计算为(3 + 2 + 1)/ 3,即2。对于第四行,前面还有两行。这次:
between 1 preceding and current row
找到当前行(4)和紧邻的前一行(3),并且该平均值计算为(4 + 3)/ 2,即3.5。前面的任何先前行都将被忽略,因此计算中既不包括2也不包括1。between 2 preceding and current row
找到当前行(4)以及前面的两个行(3和2),并且该平均值计算为(4 + 3 + 2)/ 3,即3。所有前面的行将被忽略。 ,因此计算中不包含1。如果您还计算between unbounded preceding and current row
,这是默认的(如果您根本不指定),则包括 all 前面的行。前两行没有区别;但对于第三和第四,“之前的任何先前行都将被忽略”部分将不成立。因此,第1行的平均值仍为1,第2行的平均值为1.5;对于第3行((3 + 2 + 1)/ 3)将为2;对于第4行((4 + 3 + 2 + 1)/ 4)将为2.5。
答案 1 :(得分:0)
对于您的问题“未绑定前置键和行之间的区别是什么? CURRENT ROW和前2行与当前行之间的行?“
在average_3中,您可以获得前两行与当前行之间的平均值,在average_2中也会发生同样的情况,但仅在前一行中存在,但是最好看到一个很好的例子。
史蒂夫·斯特德曼(Steve Stedman)的这本post确实很棒,并且为您提供了一个很好的例子。