SQL/BIGQUERY运行平均值,日期间隔

SQL/BIGQUERY运行平均值,日期间隔,sql,google-bigquery,average,moving-average,rolling-average,Sql,Google Bigquery,Average,Moving Average,Rolling Average,我在BigQuery/SQL中遇到移动平均问题,我有表“分数”,我需要在使用用户对数据进行分组时进行30天移动平均,问题是我的日期不连续,例如其中存在差距 以下是我目前的代码: SELECT user, date, AVG(score) OVER (PARTITION BY user ORDER BY date) FROM SCORES; 我不知道如何将日期限制添加到该行中,或者这是否可行 我当前的表如下所示,但当然有更多的用户: user date score AA

我在BigQuery/SQL中遇到移动平均问题,我有表“分数”,我需要在使用用户对数据进行分组时进行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

在最后一行中,由于日期(最多向后30天)的原因,它只能向后测量一个。是否有任何方法可以在SQL中实现这一点,或者我要求的太多了?

您想使用
介于
之间的范围。为此,您需要一个整数,因此:

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\u diff()
的替代方法是
unix\u date()


下面是BigQuery标准SQL

#standardSQL
SELECT *,
  AVG(score) OVER (
    PARTITION BY user 
    ORDER BY UNIX_DATE(PARSE_DATE('%d/%m/%Y', date))
    RANGE BETWEEN 29 PRECEDING AND CURRENT ROW
  ) AS avg_30day 
FROM `project.dataset.scores` 
您可以使用问题中的虚拟数据测试/播放上述内容

#standardSQL
WITH `project.dataset.scores` AS (
  SELECT 'AA' user, '13/02/2018' date, 2.00 score UNION ALL
  SELECT 'AA', '15/02/2018', 3.00 UNION ALL
  SELECT 'AA', '17/02/2018', 4.00 UNION ALL
  SELECT 'AA', '01/03/2018', 5.00 UNION ALL
  SELECT 'AA', '28/03/2018', 6.00 
)
SELECT *,
  AVG(score) OVER (
    PARTITION BY user 
    ORDER BY UNIX_DATE(PARSE_DATE('%d/%m/%Y', date))
    RANGE BETWEEN 29 PRECEDING AND CURRENT ROW
  ) AS avg_30day 
FROM `project.dataset.scores` 
结果

Row user    date        score   avg_30day    
1   AA      13/02/2018  2.0     2.0  
2   AA      15/02/2018  3.0     2.5  
3   AA      17/02/2018  4.0     3.0  
4   AA      01/03/2018  5.0     3.5  
5   AA      28/03/2018  6.0     5.5  

很抱歉,我是一个傻瓜,但在FROM,声明中,t指的是什么?干杯,谢谢你今晚。这是表名。我错过了你的问题有一个表名。伙计,我现在觉得自己很笨,这是完美的工作,非常感谢!
Row user    date        score   avg_30day    
1   AA      13/02/2018  2.0     2.0  
2   AA      15/02/2018  3.0     2.5  
3   AA      17/02/2018  4.0     3.0  
4   AA      01/03/2018  5.0     3.5  
5   AA      28/03/2018  6.0     5.5