我正在尝试使用LAG函数在BigQuery中计算28天的移动总和。
这个问题的最佳答案
Felipe Hoffa的表示可以使用LAG功能。例如:
SELECT
spend + spend_lagged_1day + spend_lagged_2day + spend_lagged_3day + ... + spend_lagged_27day as spend_28_day_sum,
user,
date
FROM (
SELECT spend,
LAG(spend, 1) OVER (PARTITION BY user ORDER BY date) spend_lagged_1day,
LAG(spend, 2) OVER (PARTITION BY user ORDER BY date) spend_lagged_2day,
LAG(spend, 3) OVER (PARTITION BY user ORDER BY date) spend_lagged_3day,
...
LAG(spend, 28) OVER (PARTITION BY user ORDER BY date) spend_lagged_day,
user,
date
FROM user_spend
)
有没有一种方法无需写28行SQL!
BigQuery文档不能很好地解释该工具支持的窗口函数的复杂性,因为它没有指定在ROWS或RANGE之后会出现哪些表达式。它实际上支持窗口功能的SQL 2003标准,您可以在Web上的其他位置找到文档,例如here。
这意味着您可以通过单个窗口功能获得所需的效果。范围是27,因为它是总和中当前行之前要包含的行数。
SELECT spend,
SUM(spend) OVER (PARTITION BY user ORDER BY date ROWS BETWEEN 27 PRECEDING AND CURRENT ROW),
user,
date
FROM user_spend;
RANGE范围也非常有用。如果您的表缺少某些用户的日期,那么27个PRECEDING行将返回27天以上,但是RANGE会根据日期值本身生成一个窗口。在以下查询中,日期字段为BigQuery TIMESTAMP,范围以微秒为单位。我建议您每次在BigQuery中对这样的数学进行约会时,都应进行彻底测试,以确保它能给您期望的答案。
SELECT spend,
SUM(spend) OVER (PARTITION BY user ORDER BY date RANGE BETWEEN 27 * 24 * 60 * 60 * 1000000 PRECEDING AND CURRENT ROW),
user,
date
FROM user_spend;
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句