【问题标题】:`sum() over()` without/with `order by``sum() over()` 没有/有 `order by`
【发布时间】:2020-10-10 00:09:20
【问题描述】:

在mysql中,如果你使用sum(some_col) over(),它将返回每一行的全局总和。但是当你使用sum(some_col) over(order by some_col)时,它会在两种情况下给出不同的累积和:some_col是否有重复值。

create table if not exists tsum (
    num1 int,
    num2 int
);
truncate table tsum;
insert into tsum values (2,1), (2,2), (1,3), (1,4), (3,5);
# select * from tsum;

select *, sum(num1) over (order by num1) as c1
from tsum;
select *, sum(num2) over (order by num2) as c2
from tsum;

结果是

num1, num2, c1
1,3,2
1,4,2
2,1,6
2,2,6
3,5,9

num1, num2, c2
2,1,1
2,2,3
1,3,6
1,4,10
3,5,15

为什么使用order by 会给出累积和?当订购的some_col 有重复值时,为什么累积总和会有所不同(例如,我预计c1 将是1, 2, 4, 6, 9)?

【问题讨论】:

    标签: mysql sql select sum window-functions


    【解决方案1】:

    documentation 解释了基本概念:

    ORDER BY 子句指示如何对每个分区中的行进行排序。根据ORDER BY 子句相等的分区行被视为对等。如果省略ORDER BY,则分区行是无序的,不隐含处理顺序,并且所有分区行都是对等的。

    窗口总和相应地表现,并在进行计算时考虑对等行

    • 如果没有order by,所有行都会相加。
    • order by 子句存在但生成关系时,这些是对等点,它们相加在一起。
    • order by 是确定的时,没有对等点并且每一行得到不同的结果

    【讨论】:

    • 谢谢。我之前也看过那个文档,但是我不明白sumpeer rows 有什么关系?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-19
    • 1970-01-01
    相关资源
    最近更新 更多