基于一周范围的窗口对列值求和(黑斑羚)

Posted

技术标签:

【中文标题】基于一周范围的窗口对列值求和(黑斑羚)【英文标题】:Sum column values over a window based on a week range (impala) 【发布时间】:2019-11-19 11:42:46 【问题描述】:

给定一个表格如下:

client_id   date            connections
---------------------------------------
121438297   2018-01-03      0
121438297   2018-01-08      1
121438297   2018-01-10      3
121438297   2018-01-12      1
121438297   2018-01-19      7
363863811   2018-01-18      0
363863811   2018-01-30      5
363863811   2018-02-01      4
363863811   2018-02-10      0

我正在寻找一种有效的方法来计算当前行(当前行包含在总和中)之后 6 天内发生的连接数,按 client_id 分区,这将导致:

client_id   date            connections     connections_within_6_days
---------------------------------------------------------------------
121438297   2018-01-03      0               1        
121438297   2018-01-08      1               5     
121438297   2018-01-10      3               4     
121438297   2018-01-12      1               1                       
121438297   2018-01-19      7               7
363863811   2018-01-18      0               0
363863811   2018-01-30      5               9
363863811   2018-02-01      4               4
363863811   2018-02-10      0               0

问题:

    我不想添加所有缺失的日期,然后执行一个滑动窗口来计算后面的 7 行,因为我的表已经非常大了。

    我使用的是 Impala,不支持 range between interval '7' days following and current row


编辑:考虑到我需要将窗口大小更改为更大的数字(例如 30 天以上),我正在寻找一个通用答案

【问题讨论】:

【参考方案1】:

这回答了问题的原始版本。

Impala 不完全支持range between。不幸的是,这并没有留下很多选择。一种是使用带有大量显式逻辑的lag()

select t.*,
       ( (case when lag(date, 6) over (partition by client_id order by date) = date - interval 6 day
               then lag(connections, 6) over (partition by client_id order by date)
               else 0
          end) +
         (case when lag(date, 5) over (partition by client_id order by date) = date - interval 6 day
               then lag(connections, 5) over (partition by client_id order by date)
               else 0
          end) +
         (case when lag(date, 4) over (partition by client_id order by date) = date - interval 6 day
               then lag(connections, 4) over (partition by client_id order by date)
               else 0
          end) +
         (case when lag(date, 3) over (partition by client_id order by date) = date - interval 6 day
               then lag(connections, 3) over (partition by client_id order by date)
               else 0
          end) +
         (case when lag(date, 2) over (partition by client_id order by date) = date - interval 6 day
               then lag(connections, 2) over (partition by client_id order by date)
               else 0
          end) +
         (case when lag(date, 1) over (partition by client_id order by date) = date - interval 6 day
               then lag(connections, 1) over (partition by client_id order by date)
               else 0
          end) +
         connections
        ) as connections_within_6_days         
from t;

不幸的是,这并不能很好地概括。如果您想要一个广泛的日期,您可能想问另一个问题。

【讨论】:

谢谢@gordon-linoff,我已经编辑了我的答案以考虑到微妙之处。我找到了something,虽然我无法在 Impala 中重现,但它可能会有所帮助。 @nicholas 。 . .正如这个问题所建议的那样,您应该提出一个 问题。您的原始问题已得到解答。

以上是关于基于一周范围的窗口对列值求和(黑斑羚)的主要内容,如果未能解决你的问题,请参考以下文章

基于多索引对列值求和

创建视图并对列值进行求和

使用 sqlbulktools 更新表时对列值求和

使用相同的 ID 列递增地对列值求和

Pandas:如何根据其他列值的条件对列进行求和?

对列值使用变量提示和过滤语句