`sum()over()`without/with`order by`

rjee0c15  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(393)

在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 )?

kx1ctssn

kx1ctssn1#

文档解释了基本概念:
ORDER BY 子句指示如何对每个分区中的行进行排序。根据 ORDER BY 条款被视为对等条款。如果 ORDER BY 如果忽略,则分区行是无序的,没有隐含处理顺序,并且所有分区行都是对等的。
窗口和的行为相应,并在执行计算时考虑对等行:
没有一个 order by ,所有行相加。
order by 子句是存在的,但会产生联系,这些联系是对等的,它们相加在一起。
order by 是确定性的,没有对等点,每行得到不同的结果

相关问题