使用SQL / Impala在一段时间内累计总和

时间:2020-08-06 12:27:47

标签: sql impala

我的表格结构如下:

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

仅当Value> 0时存在DateDay的地方 我有几个可能的IDs

我想做的是获得一个表,其中每个ID均在7天的时间内滚动显示Value。但是应该整天都在里面

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
...         ...    ...      ...

是否有一种简单的方法可以通过SQL(我使用的是Impala / Hive)完成此任务?

1 个答案:

答案 0 :(得分:1)

您有两个问题-生成行和累积和。让我假设该表具有您想要的所有时间段,或者您拥有另一个时间段。然后使用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;

如果您还有其他带有日期或ID的表,请使用这些表代替子查询。

一整天都可以包含一个窗口框架子句:

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