bkn*_*ght 3 sql average moving-average google-bigquery rolling-average
我在 BigQuery/SQL 中的移动平均值方面遇到问题,我有表“SCORES”,我需要在使用用户对数据进行分组时制作 30 天的移动平均值,问题是我的日期不是连续的,例如存在间隙在里面。
下面是我当前的代码:
SELECT user, date,
AVG(score) OVER (PARTITION BY user ORDER BY date)
FROM SCORES;
Run Code Online (Sandbox Code Playgroud)
我不知道如何将日期限制添加到该行中,或者这是否可能。
我当前的表如下所示,但当然有更多的用户:
user date score
AA 13/02/2018 2.00
AA 15/02/2018 3.00
AA 17/02/2018 4.00
AA 01/03/2018 5.00
AA 28/03/2018 6.00
Run Code Online (Sandbox Code Playgroud)
然后我需要它变成这样:
user date score 30D Avg
AA 13/02/2018 2.00 2.00
AA 15/02/2018 3.00 2.50
AA 17/02/2018 4.00 3.00
AA 01/03/2018 5.00 3.50
AA 28/03/2018 6.00 5.50
Run Code Online (Sandbox Code Playgroud)
在最后一行中,由于日期(向后最多 30D),它仅向后测量一个,有什么方法可以在 SQL 中实现这一点,还是我要求太多?
你想用range between. 为此,您需要一个整数,因此:
select s.*,
avg(score) over (partition by user
order by days
range between 29 preceding and current row
) as avg_30day
from (select s.*, date_diff(s.date, date('2000-01-01'), day) as days
from scores s
) s;
Run Code Online (Sandbox Code Playgroud)
替代方案date_diff()是unix_date():
select s.*,
avg(score) over (partition by user
order by unix_days
range between 29 preceding and current row
) as avg_30day
from (select s.*, unix_date(s.date) as unix_days
from scores s
) s;
Run Code Online (Sandbox Code Playgroud)