BigQuery窗口函数ROWS BETWEEN子句能否使用已声明的变量
解决方案
BigQuery的窗口帧定义(ROWS/RANGE BETWEEN ...)要求边界值必须是字面量或者查询参数,不支持直接引用脚本中DECLARE声明的变量,因此会触发对应报错。以下是两种可落地的实现方案:
方案1:使用EXECUTE IMMEDIATE动态构造SQL(最适合脚本内变量复用)
通过字符串拼接把变量值直接注入SQL语句,执行效果和写死字面量完全一致,变量修改后所有引用位置自动同步,完美满足多处复用的需求,代码示例:
DECLARE variable INT64; SET variable = 5; EXECUTE IMMEDIATE format(""" SELECT col1, value, time, CASE WHEN "Bla" = "Bla" THEN MIN(value) OVER (PARTITION BY col1 ORDER BY time ROWS BETWEEN %d PRECEDING AND CURRENT ROW) ELSE NULL END AS MinVal FROM data """, variable);
方案2:使用查询参数(适合外部传参/存储过程场景)
如果是在存储过程、外部API/SDK调用的场景下,可以直接把窗口大小作为查询参数传入,参数本身符合窗口帧对入参的要求,不需要动态拼接,代码示例:
-- 封装为存储过程示例 CREATE OR REPLACE PROCEDURE calc_min_val(window_size INT64) BEGIN SELECT col1, value, time, CASE WHEN "Bla" = "Bla" THEN MIN(value) OVER (PARTITION BY col1 ORDER BY time ROWS BETWEEN window_size PRECEDING AND CURRENT ROW) ELSE NULL END AS MinVal FROM data; END; -- 调用时传入需要的窗口大小即可 CALL calc_min_val(5);
内容的提问来源于stack exchange,提问作者Lenny M
相关产品推荐
相关产品推荐

