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

BigQuery报错Cannot read properties of null (reading 'row')

SQL执行报Cannot read properties of null (reading 'row')修复方案

问题背景

需求为获取与指定日期最接近的首个ID,预期实现逻辑:

  • 先筛选date小于等于目标日期的记录
  • 通过PARTITION BY id分组、按date排序后生成行号
  • 筛选行号为1的记录,得到目标时间窗口内每个主体最接近目标日期的首条观测值(预设同一主体在目标窗口内可能关联多个ID)

当前编写的SQL运行即抛出错误:Cannot read properties of null (reading 'row'),原SQL代码如下:

SELECT
  *,
  ROW_NUMBER() OVER (PARTITION BY id ORDER BY date) AS rn
FROM (
  SELECT
    *, -- 此处存在多余尾逗号
  FROM (
    SELECT
      *,
      PARSE_TIMESTAMP('%Y-%m-%dT%H:%M:%E*S', date_column) AS date
    FROM
      `data`
  )
  WHERE
    date <= '2022-03-10 00:00:00.000000 UTC'
)

错误原因

  • 核心语法错误:第二层子查询的SELECT语句末尾多了无后续字段的尾逗号,SQL解析器读取字段列表时遇到空值,无法正常构建查询语法树,触发空指针报错,和后续计划添加的rn筛选逻辑无关。
  • 隐含逻辑错误:当前窗口函数使用ORDER BY date升序排序,取行号1会得到每个ID下时间最早的记录,不符合“最接近目标日期”的需求。

修复后代码

SELECT
  * EXCEPT(rn)
FROM (
  SELECT
    *,
    ROW_NUMBER() OVER (PARTITION BY id ORDER BY date DESC) AS rn
  FROM (
    SELECT
      *,
      PARSE_TIMESTAMP('%Y-%m-%dT%H:%M:%E*S', date_column) AS date
    FROM
      `data`
  )
  WHERE
    date <= TIMESTAMP('2022-03-10 00:00:00.000000 UTC')
)
WHERE rn = 1

补充说明

  • 如果需要保留原多层嵌套结构,仅删除第二层子查询中SELECT *,后的多余逗号即可解决当前报错。
  • 时间比较时建议显式用TIMESTAMP()函数包裹比较值,避免隐式类型转换带来的匹配误差。
  • 如果date_column存在不符合指定格式的脏数据,可以将PARSE_TIMESTAMP替换为SAFE.PARSE_TIMESTAMP,避免解析失败直接中断查询。

内容的提问来源于stack exchange,提问作者emilk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 23:03:54