【问题标题】:Rolling sum over a period with SQL/Impala使用 SQL/Impala 在一段时间内滚动总和
【发布时间】:2020-08-06 12:27:47
【问题描述】:

我的表格结构如下:

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

仅当 Value > 0 时才出现 DateDay 而且我有几个可能的 ID

我想做的是获得一个表格,其中包含每个 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)来完成?

【问题讨论】:

    标签: sql impala


    【解决方案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
    

    【讨论】:

    • 谢谢,这似乎解决了请求,但还剩下一件事:滚动总和应仅计算前 7 天
    • @espogian 。 . .您可以使用窗框子句。
    猜你喜欢
    • 2013-10-13
    • 2018-12-17
    • 1970-01-01
    • 1970-01-01
    • 2015-03-13
    • 2020-03-19
    • 1970-01-01
    • 1970-01-01
    • 2022-12-01
    相关资源
    最近更新 更多