SQL/BIGQUERY 运行平均值与日期中的 GAP

标签 sql google-bigquery average moving-average rolling-average

我在 BigQuery/SQL 中遇到移动平均线问题,我有表“SCORES”,我需要在使用用户对数据进行分组时制作 30 天移动平均线,问题是我的日期不是连续的,例如里面有缝隙。

下面是我当前的代码:

SELECT user, date,
      AVG(score) OVER (PARTITION BY user ORDER BY date)
FROM SCORES;

我不知道如何将日期限制添加到该行中,或者这是否可能。

我当前的表看起来像这样,但当然有更多的用户:

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

然后我需要它变成这样:

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

在最后一行的哪个位置,由于日期(最多向后 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;

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;

关于SQL/BIGQUERY 运行平均值与日期中的 GAP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52457337/

相关文章:

r - 如何使用 dplyr 和 bigrquery 从 Big Query 中的数据集中的多个表中进行选择?

mysql - SUM 后在 SQL 查询中查找 AVG 值 - 组函数的使用无效

c++ - 第二个 while 循环未运行,将值设置为 "nan"

java - 读取学生姓名和文本分数的文本文件并计算平均值

google-bigquery - BigQuery 表设计 - 混合事实表和维度表?

sql - 使用 GROUP BY 获取其最昂贵产品的名称和价格

sql - SELECT 语句中的重复行

sql - 从 sql RUBY/shoes GUI 获取 list_box

sql - 如何在oracle sql中获取时间字符串到Time

go - BigQuery 中的表联接