Google BigQuery计算30天滚动净销售额触发JOIN报错如何解决?
问题原因
该报错是BigQuery对关联子查询的实现限制导致的:你写的嵌套求和子查询会被BigQuery默认转换为LEFT OUTER JOIN执行,但子查询里的条件是date的范围判断,没有两边表的等值关联条件,因此触发了语法校验报错。
解决方法
最优方案是使用BigQuery支持的窗口函数实现滚动30天求和,不需要写嵌套子查询,性能也远高于关联子查询的写法:
thirty_days_net_sales AS ( SELECT date, net_sales AS net_sales_on_date, -- 计算当前日期往前推30天(含当天)的累计销售额 SUM(net_sales) OVER ( ORDER BY date RANGE BETWEEN INTERVAL 29 DAY PRECEDING AND CURRENT ROW ) AS last_30d_total_net_sales FROM total_net_sales_per_day )
补充说明
- 如果你的
total_net_sales_per_day表的日期是严格连续、无缺失的,也可以用行偏移的窗口写法,和上面效果一致:SUM(net_sales) OVER ( ORDER BY date ROWS BETWEEN 29 PRECEDING AND CURRENT ROW ) AS last_30d_total_net_sales - 如果你确实需要用关联子查询的逻辑实现,可以显式写
CROSS JOIN后加范围过滤,避免隐式转换的问题,但性能远低于窗口函数方案,不推荐:thirty_days_net_sales AS ( SELECT t1.date, t1.net_sales AS net_sales_on_date, SUM(t2.net_sales) AS last_30d_total_net_sales FROM total_net_sales_per_day t1 CROSS JOIN total_net_sales_per_day t2 WHERE t2.date >= DATE_SUB(t1.date, INTERVAL 30 DAY) AND t2.date <= t1.date GROUP BY t1.date, t1.net_sales )
内容的提问来源于stack exchange,提问作者butitruns
相关产品推荐
相关产品推荐

