Как найти промежуточную сумму по двум столбцам в SQL - PullRequest
2 голосов
/ 01 мая 2020

У меня есть такая таблица:

month region    value
4/1/20  eu-west-2   110
3/1/20  eu-west-2   30
2/1/20  eu-west-2   13
2/1/20  us-west-2   2
1/1/20  us-west-2   242
4/1/20  us-west-2   240

Я хочу найти кумулятивную сумму для столбца «значение» для каждого региона каждый месяц. Например, используя приведенный выше пример, ответ должен быть:

month region cumulative_sum
4/1/20 eu-west-2  153
3/1/20 eu-west-2  43
2/1/20 eu-west-2  13
4/1/20 us-west-2  484
2/1/20 us-west-2  244
1/1/20 us-west-2  242

Я могу успешно написать запрос, когда нахожу только суммарную сумму за каждый месяц, но он не работает, когда я добавляю регион в это:

select
month, sum(value) over (order by month rows unbounded preceding) as cumulative_sum
from table

но когда я делаю:

  select
    month, region, sum(value) over (order by month,region rows unbounded preceding) as cumulative_sum
    from table

это дает неправильные результаты.

Пожалуйста, помогите.

Ответы [ 2 ]

3 голосов
/ 01 мая 2020

Предполагая, что month является столбцом типа данных, подобного дате, вы можете сделать:

select
    month,
    region,
    sum(value) over(
        partition by region, date_trunc('month', month)
        order by month
    ) cumulative_sum
from mytable

Предложение partition by окна sum() объединяет строки, принадлежащие одному и тому же месяц и регион. При каждом изменении региона или начале нового месяца сумма сбрасывается.

1 голос
/ 01 мая 2020

Вы довольно близко, за исключением того, что вам не хватает partition by:

select month, region,
       sum(value) over (partition by region order by month rows unbounded preceding) as cumulative_sum
from table
...