sum作为窗口函数产生奇怪的结果

时间:2015-12-10 13:44:47

标签: sql postgresql window-functions

考虑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

0 个答案:

没有答案