BigQuery中FIRST_VALUE窗口函数IGNORE NULLS未生效原因咨询
问题根因
你遇到的这个问题和FIRST_VALUE是否识别CASE语句返回的NULL无关,核心原因是带ORDER BY的窗口函数默认使用了限制范围的窗口帧。
在BigQuery的窗口语法中,如果你在OVER()子句中指定了ORDER BY但没有显式声明窗口帧范围,默认会采用如下帧规则:
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
这意味着每一行计算窗口函数时,仅能看到排序后从第一行到当前行的范围:
- 第一行(order_key=1)的窗口仅包含自身,CASE语句返回NULL,
IGNORE NULLS下无有效取值,返回NULL - 第二行(order_key=2)的窗口包含前两行,两行的CASE返回值均为NULL,无有效取值,返回NULL
- 第三行(order_key=3)的窗口包含所有三行,才找到了第一个非空值
value
验证方案
你可以直接通过显式指定窗口帧为整个分区范围,不需要拆分CASE逻辑到子查询就能得到预期结果:
SELECT FIRST_VALUE( CASE WHEN val = "undefined" THEN NULL ELSE val END IGNORE NULLS ) OVER ( ORDER BY order_key -- 显式指定窗口覆盖分区内所有行 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) AS res FROM ( SELECT 1 AS order_key, CAST(NULL AS STRING) AS val UNION ALL SELECT 2 AS order_key, "undefined" AS val UNION ALL SELECT 3 AS order_key, "value" AS val ) base
执行后返回的结果就是你预期的三行均为value,这也直接证明了FIRST_VALUE的IGNORE NULLS可以正常识别CASE语句返回的NULL值,你之前的猜测不成立。
补充说明
如果你的实际场景需要按业务维度分区计算,只需要在OVER()里增加对应的PARTITION BY字段即可,窗口帧规则同样适用。
内容的提问来源于stack exchange,提问作者Philippe Hebert
相关产品推荐
相关产品推荐

