基于可变日期范围的窗口上的列值总和(impala)

u0njafvf  于 2021-06-26  发布在  Impala
关注(0)|答案(1)|浏览(336)

给出如下表格:

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

我正在寻找一种有效的方法来计算发生在 x 当前行(当前行包含在总和中)之后的天数,按客户端id分区。
如果 x=6 然后输出表将导致:

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

关注点:
我不想添加所有丢失的日期,然后执行滑动窗口计数 x 因为我的表已经非常大了。
我用 Impala 和 range between interval 'x' days following and current row 不支持。

hgb9j2n6

hgb9j2n61#

通用解决方案对于多个时段来说有点麻烦,但是您可以使用多个cte来支持这一点。这样做的目的是根据他们进出的时间来“取消”计数,然后使用一个累积的总和。
所以:

with conn as (
      select client_id, date, connections
      from t
      union all
      select client_id, date + interval 7 day, -connections
      from t
     ),
     conn1 as (
      select client_id, date,
             sum(sum(connections)) over (partition by client_id order by date) as connections_within_6_days
      from t
      group by client_id, date
     )
select t.*, conn1. connections_within_6_days
from t join
     conn1
     on conn1.client_id = t.client_id and
        conn1.date = t.date;

相关问题