Скользящая сумма за период с SQL / Impala - PullRequest
0 голосов
/ 06 августа 2020

У меня есть таблица, структурированная следующим образом:

DateDay     Id     Value    
20200801    A      7
20200803    A      1
20200803    B      3
20200804    C      30
...         ...    ...

Где DateDay присутствует, только если Value> 0 И у меня есть несколько возможных идентификаторов

Я бы хотел получить таблица со скользящей суммой значений за период 7 дней для каждого идентификатора. Но в нем должны быть все дни

DateDay     Id     Value    RollingSum    
20200801    A      7        7
20200801    B      0        0
20200801    C      0        0
20200802    A      0        7
20200802    B      0        0
20200802    C      0        0
20200803    A      1        8        
20200803    B      3        3
20200803    C      0        0
20200804    A      0        8
20200804    B      0        3
20200804    C      30       30
...         ...    ...      ...

Есть ли простой способ выполнить sh это через SQL (я использую Impala / Hive)?

1 Ответ

1 голос
/ 06 августа 2020

У вас есть две проблемы - создание строк и накопительные суммы. Позвольте предположить, что в таблице есть все периоды времени, которые вы хотите, или у вас есть другая таблица с ними. Затем используйте cross join для генерации строк и кумулятивной суммы результатов:

select d.dateday, i.id,
       sum(t.value) over (partition by i.id order by d.dateday) as running_sum
from (select distinct dateday from t) d cross join
     (select distinct id from t) i left join
     t
     on t.dateday = d.dateday and t.id = i.id
order by d.dateday, i.id;

Если у вас есть другие таблицы с днями или идентификаторами, используйте их вместо подзапросов.

Когда у вас есть все дни, вы можете включить предложение оконной рамы:

       sum(t.value) over (partition by i.id order by d.dateday rows between 6 preceding and current day) as running_sum
...