在大查询中进行滚动聚合的更好方法?

时间:2018-08-14 15:27:41

标签: google-bigquery

我有一些用BigQuery编写的SQL代码,该代码对从当前日期算起的三天前的值进行滚动计算。

with weekly_agg AS
(
select 
    * ,
    UNIX_SECONDS(TIMESTAMP(event_date)) as timestamps
from
    test.window_test
order by event_date
)
select 
    country,
    event_date
    sum(value) over (partition by country order by timestamps range between 259200 PRECEDING AND CURRENT ROW) as rolling
from
     weekly_agg 

这似乎是解决问题的漫长方法,是否有更好的方法来完成同一件事?第一个限制是您需要对值259200(3天)进行硬编码,无法输入诸如((3600 * 24)* 3)之类的计算结果。如果可以在分区部分中做一个日期范围,那会更好。

1 个答案:

答案 0 :(得分:1)

  

第一个限制是您需要对值259200(3天)进行硬编码,您无法输入诸如((3600 * 24)* 3)的计算

以下仅使用3

#standardSQL
WITH weekly_agg AS (
  SELECT 
    * ,
    DATE_DIFF(event_date, '2000-01-01', DAY) AS day
  FROM `test.window_test`
  ORDER BY event_date
)
SELECT 
  country,
  event_date,
  SUM(value) OVER(PARTITION BY country ORDER BY day RANGE BETWEEN 3 PRECEDING AND CURRENT ROW) AS rolling
FROM weekly_agg    
  

是否可以使用日期而不是数字之间的范围?

如果您将使用日期而不是日期-这将是其他逻辑(不是rolling aggregation)-类似简单的分组-例如

SELECT 
  country,
  event_date,
  SUM(value) 
FROM weekly_agg  
WHERE event_date BETWEEN <date1> AND <date2>
GROUP BY country, event_date   

但这很可能不是您想要的...