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

时间:2019-05-13 01:41:40

标签: sql sqlite aggregate-functions window-functions

我遇到一个查询,该查询带有使用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;

这将返回预期结果...所有值的总和。 10254570100

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

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

我得到未应用聚合的结果。 1015202530

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

1 个答案:

答案 0 :(得分:1)

我什至对此感到惊讶:

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

我的意思是的。基本上,子查询是相关子查询,因此它针对外部查询中的每一行运行。也就是说,每次运行只有一个值-外部查询的相关值。那只是返回数字。

目前尚不清楚您真正想做什么。

当我第一次阅读查询时,我以为是

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

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

FROM移至子查询:

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

由于子查询返回多个行,因此中断了查询。