在子查询中使用聚合和 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 不止一行。
我有一个查询的子查询使用 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 不止一行。