关于BigQuery中TIME类型列求平均值的逻辑确认
问题:BigQuery中TIME类型列求平均值的代码逻辑确认
我在BigQuery中尝试对TIME类型的length_of_ride列求平均值时,发现AVG()函数不直接支持TIME类型,报错提示AVG仅支持INT64、FLOAT64及INTERVAL类型。之后找到一段解决方案代码:
SELECT AVG(length_of_ride - '0:0:0') as length_of_ride_1,
我推测这段代码是把TIME类型转换为INTERVAL类型后再求平均,想确认这个逻辑是否正确,如果不正确的话,请解释代码的实际原理。
回答
你的推测不正确,这段代码的实际逻辑是将TIME类型转换为INT64类型的微秒数后计算平均值,而非转换为INTERVAL类型。
在BigQuery中,这段代码的执行逻辑细节:
- 字符串
'0:0:0'会被隐式转换为TIME类型的00:00:00 - 两个
TIME值相减,返回结果为INT64类型的微秒数,代表当前length_of_ride与零点的时间差 AVG()函数对这些微秒数求平均,最终得到的length_of_ride_1是FLOAT64类型的数值,对应平均骑行时长的微秒数
如果需要将结果转回TIME类型,可以用TIME_ADD函数做转换,示例代码:
SELECT TIME_ADD('00:00:00', INTERVAL AVG(length_of_ride - '0:0:0') MICROSECOND) AS avg_length_of_ride
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

