如何理解前两行和当前行之间的行结果?

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?我从互联网上阅读了很多解释,现在我很困惑,因为他们用不同的语法进行了解释。

Ale*_*ole 9

对于第一行(最早的时间),没有前面的行,因此两者between 1 preceding and current rowbetween 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)。

阅读更多


小智 1

对于您的问题“无界前行和当前行之间的行与前 2 行和当前行之间的行之间有什么区别?”

在average_3中,您可以获得前两行和当前行之间的平均值,在average_2中也会发生同样的情况,但仅限于前一行,但最好看一个很好的例子。

Steve Stedman 的这篇文章非常好,它为您提供了一个很好的例子。