use*_*ser 6 sql oracle window-functions
我的 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;
Run Code Online (Sandbox Code Playgroud)
我试图理解这些窗口函数。我使用了一些测试数据并得到了结果:
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
Run Code Online (Sandbox Code Playgroud)
我需要知道:如何获得这些结果?特别是average_3
?
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
和 和有什么区别rows between 2 preceding and current row
?我从互联网上阅读了很多解释,现在我很困惑,因为他们用不同的语法进行了解释。
对于第一行(最早的时间),没有前面的行,因此两者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
,这是默认值(如果您根本没有指定),则包括所有前面的行。这对于前两行没有什么区别;但对于第三个和第四个,“任何先前的行都被忽略”部分将不成立。因此,第 1 行的平均值仍为 1,第 2 行的平均值仍为 1.5;第 3 行的值为 2 ((3+2+1)/3;第 4 行的值为 2.5 ((4+3+2+1)/4)。
阅读更多。
归档时间: |
|
查看次数: |
13163 次 |
最近记录: |