我有一些用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)之类的计算结果。如果可以在分区部分中做一个日期范围,那会更好。
答案 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
但这很可能不是您想要的...