在子查询中使用聚合和 window 函数

Using aggregate and window function within a sub-query

我有一个查询的子查询使用 SUM() OVER。虽然子查询本身可以正常工作,但在外部查询的上下文中使用时,不会应用聚合。

我已经制作了这个测试用例来近似我正在尝试做的事情:

CREATE TEMPORARY TABLE TestNumbers
  (id INTEGER PRIMARY KEY, number INTEGER);
INSERT INTO TestNumbers (number)
  VALUES (10), (15), (20), (25), (30);

SELECT SUM(number) OVER (ORDER BY id) FROM TestNumbers;

这 returns 预期结果...所有值的滚动总和。 10, 25, 45, 70, 100.

但是,如果我将其用作子查询...

SELECT (
  SELECT SUM(number) OVER (ORDER BY id)
) FROM TestNumbers;

我得到的结果没有应用聚合。 10, 15, 20, 25, 30.

如何在子查询中将此聚合与 OVER 一起使用?

我很惊讶这竟然有效:

SELECT (SELECT SUM(number) OVER (ORDER BY id))
FROM TestNumbers;

我的意思是,确实如此。基本上,子查询是相关子查询,因此它 运行s 用于外部查询中的每一行。也就是说,每个 运行 只有一个值——来自外部查询的相关值。那只是 return 这个数字。

不清楚你真正想做什么。

当我第一次阅读查询时,我认为它是:

SELECT *
FROM (SELECT SUM(number) OVER (ORDER BY id))
      FROM TestNumbers
     ) tn

这很好,可以使用累加值。

FROM 移动到子查询:

SELECT (SELECT SUM(number) OVER (ORDER BY id))
        FROM TestNumbers
       )

中断查询,因为子查询 return 不止一行。