我遇到一个查询,该查询带有使用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;
这将返回预期结果...所有值的总和。 10
,25
,45
,70
,100
。
但是,如果我将其用作子查询...
SELECT (
SELECT SUM(number) OVER (ORDER BY id)
) FROM TestNumbers;
我得到未应用聚合的结果。 10
,15
,20
,25
,30
。
如何在子查询中将这种聚合与OVER
一起使用?
答案 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
)
由于子查询返回多个行,因此中断了查询。