SQL/Impala 期间的滚动总和
Rolling sum over a period with SQL/Impala
我有一个 table 结构如下:
DateDay Id Value
20200801 A 7
20200803 A 1
20200803 B 3
20200804 C 30
... ... ...
只有当值 > 0 时 DateDay 才会出现
我有几个可能的 ID
我想做的是获得一个 table,每个 ID 在 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
... ... ... ...
是否有一种简单的方法可以通过 SQL(我使用的是 Impala/Hive)来完成此操作?
您有两个问题——生成行和累积总和。让我假设 table 有您想要的所有时间段,或者您有另一个 table。然后使用 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;
如果您还有其他 table 带有日期或 ID,请使用这些而不是子查询。
一旦你有了所有的日子,你就可以包括一个window框架子句:
sum(t.value) over (partition by i.id order by d.dateday rows between 6 preceding and current day) as running_sum
我有一个 table 结构如下:
DateDay Id Value
20200801 A 7
20200803 A 1
20200803 B 3
20200804 C 30
... ... ...
只有当值 > 0 时 DateDay 才会出现 我有几个可能的 ID
我想做的是获得一个 table,每个 ID 在 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
... ... ... ...
是否有一种简单的方法可以通过 SQL(我使用的是 Impala/Hive)来完成此操作?
您有两个问题——生成行和累积总和。让我假设 table 有您想要的所有时间段,或者您有另一个 table。然后使用 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;
如果您还有其他 table 带有日期或 ID,请使用这些而不是子查询。
一旦你有了所有的日子,你就可以包括一个window框架子句:
sum(t.value) over (partition by i.id order by d.dateday rows between 6 preceding and current day) as running_sum