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
相关产品推荐
相关产品推荐

