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

How to understand the results of rows between 2 preceding and current row?

我的 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; 

我正在尝试理解这些 window 函数。我使用了一些测试数据并得到了结果:

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 ROWrows between 2 preceding and current row有什么区别?我在网上看了很多解释,现在我很困惑,因为他们解释的语法不同。

对于第一行(最早的时间),没有前面的行,所以 between 1 preceding and current rowbetween 2 preceding and current row 实际上只找到当前行。因此,这两个平均值都是单个值 1 的平均值,这当然是 1。

对于第二行,只有一个前面的行,所以 between 1 preceding and current rowbetween 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,这是默认设置(如果您根本没有指定),那么 所有 前面的行都包括在内。这对前两行没有影响;但是对于第三个和第四个 'any earlier preceding rows are ignored' 部分是不正确的。因此,第 1 行的平均值仍为 1,第 2 行的平均值为 1.5;第 3 行 ((3+2+1)/3) 为 2;第 4 行 ((4+3+2+1)/4) 为 2.5。

Read more.

对于您的问题“ROWS BETWEEN UNBOUNDED PRECEDING AND 之间的区别是什么 当前行和前 2 行与当前行之间的行?”

在average_3中你得到前两行和当前行之间的平均值,在average_2中也会发生同样的情况,但只有前一行,但最好看一个很好的例子

Steve Stedman 的 post 非常好,它为您提供了一个很好的例子。