You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 02:09:01