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

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

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

  1. create table if not exists tsum (
  2. num1 int,
  3. num2 int
  4. );
  5. truncate table tsum;
  6. insert into tsum values (2,1), (2,2), (1,3), (1,4), (3,5);
  7. # select * from tsum;
  8. select *, sum(num1) over (order by num1) as c1
  9. from tsum;
  10. select *, sum(num2) over (order by num2) as c2
  11. from tsum;

结果是

  1. num1, num2, c1
  2. 1,3,2
  3. 1,4,2
  4. 2,1,6
  5. 2,2,6
  6. 3,5,9
  7. num1, num2, c2
  8. 2,1,1
  9. 2,2,3
  10. 1,3,6
  11. 1,4,10
  12. 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 是确定性的,没有对等点,每行得到不同的结果

相关问题