考虑PostgreSQL中的以下查询:
select x, sum(x) over (order by x)
from (
select 1 x
from generate_series(1, 5)
union all
select generate_series(1, 5) x
) q
我希望结果如下:
x | sum integer | bigint --------+------- 1 | 1 1 | 2 1 | 3 1 | 4 1 | 5 1 | 6 2 | 8 3 | 11 4 | 15 5 | 20
但相反,我得到了这个:
x | sum integer | bigint --------+------- 1 | 6 1 | 6 1 | 6 1 | 6 1 | 6 1 | 6 2 | 8 3 | 11 4 | 15 5 | 20
这可能是sum
预期的行为,不仅在PostgreSQL中,而且在支持使用sum
作为窗口函数的其他RDBMS中?
这里的问题似乎是它不会在一组相邻的行中维持一个与订购标准相等的运行总计。但这真的是预期的行为还是只是一个错误?
这是一种解决方法,但它似乎是必要的:
select x, sum(x) over (order by rn)
from (
select x, row_number() over (order by x) rn
from (
select 1 x
from generate_series(1, 5)
union all
select generate_series(1, 5) x
) q
) r