BigQuery报错:INT64与ARRAY<INT64>无法使用>=运算符求助
解决BigQuery中30分钟间隔区间统计的类型匹配错误
错误原因
原代码中bins CTE生成的low和top是数组类型,而ride表中的cicle是单个整数类型,直接用cicle >= low进行比较会触发类型不匹配的错误——BigQuery不支持单个整数与数组直接做比较运算。
修正后的查询代码
WITH bins AS( -- 将30分钟间隔的数值数组拆分为一一对应的单行区间 SELECT low_val AS low, top_val AS top FROM UNNEST(GENERATE_ARRAY(0, 1470, 30)) AS low_val WITH OFFSET AS pos JOIN UNNEST(GENERATE_ARRAY(30, 1500, 30)) AS top_val WITH OFFSET AS pos USING(pos) ), ride AS( SELECT DATE_DIFF(ended_at, started_at, minute) as cicle FROM `data-project-389314.Cyclist.july23_trip_filtered` WHERE rideable_type != 'docked_bike' ) SELECT low, top, COUNT(cicle) AS ride_count -- 统计每个区间内的骑行次数 FROM bins LEFT JOIN ride ON cicle >= low AND cicle < top GROUP BY low, top ORDER BY low
关键修改说明
- 拆分数组为单行数值:使用
UNNEST配合WITH OFFSET,将生成的low和top数组按位置一一对应,拆分为每行一个区间的单个数值,彻底解决类型不匹配问题。 - 修正区间逻辑:原
top数组起始值为0会导致区间重叠(如0-0),调整为从30开始,确保每个区间是[low, top)的30分钟间隔(例如0-30分钟、30-60分钟等)。 - 添加聚合统计:原代码
GROUP BY low, top后直接返回cicle不符合SQL语法,添加COUNT(cicle)统计每个区间内的骑行次数,符合业务统计需求。
额外说明
如果你的骑行时长不会超过24小时(1440分钟),可以调整bins中的数组上限:
- 将
GENERATE_ARRAY(0, 1470, 30)改为GENERATE_ARRAY(0, 1410, 30) - 将
GENERATE_ARRAY(30, 1500, 30)改为GENERATE_ARRAY(30, 1440, 30)
这样最后一个区间为1410-1440分钟(23.5-24小时),避免出现超过24小时的区间。
内容的提问来源于stack exchange,提问作者Danylo Borges Naves
相关产品推荐
相关产品推荐

