`sum () over ()` без / с `order by` - PullRequest
0 голосов
/ 19 июня 2020

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

1 Ответ

0 голосов
/ 19 июня 2020

Документация объясняет базовые концепции:

Предложение ORDER BY указывает, как сортировать строки в каждом разделе. Строки разделов, равные согласно условию ORDER BY, считаются одноранговыми. Если ORDER BY опущено, строки разделов неупорядочены, без подразумеваемого порядка обработки, и все строки раздела являются одноранговыми.

Сумма окна ведет себя соответствующим образом и учитывает одноранговые строки при выполнении вычисления:

  • без order by, все строки суммируются.
  • когда предложение order by присутствует, но генерирует связи, это одноранговые узлы, суммируются вместе.
  • когда order by определено c, одноранговых узлов нет, и каждая строка получает свой результат
...