sql - 执行 SUM 聚合操作时使用通配符的 Big Query 出错
问题描述
我正在尝试使用谷歌大查询对某些数据进行SUM 聚合。我正在尝试使用通配符来查询多个表。通配符格式适用于某些数据类型的列,例如INTEGER ,但不适用于其他数据类型,例如FLOAT。以下是我尝试执行的查询的表示
[更新]到目前为止, trip_distance (FLOAT)列似乎失败了。同样的查询适用于另一列passenger_count(INTEGER)
FAILURE CASE : FLOAT (trip_distance) 的通配符格式
单表查询:
select sum(trip_distance) from `bigquery-public-data.new_york_taxi_trips.tlc_green_trips_*` where _TABLE_SUFFIX in ('2014')
查询多个表:
select sum(trip_distance) from `bigquery-public-data.new_york_taxi_trips.tlc_green_trips_*` where _TABLE_SUFFIX in ('2014', '2015')
上述查询引发如下错误
错误:无法将 FLOAT64 类型的字段“trip_distance”读取为 NUMERIC
我不确定为什么 ABOVE 错误,因为以下查询有效(我想避免使用非通配符,因为它会变得很大,因为人们想要查询更多表)。
SUCCEEDS:passenger_count 的通配符格式(整数)
单表查询:
select sum(passenger_count) from `bigquery-public-data.new_york_taxi_trips.tlc_green_trips_*` where _TABLE_SUFFIX in ('2014')
查询多个表:
select sum(passenger_count) from `bigquery-public-data.new_york_taxi_trips.tlc_green_trips_*` where _TABLE_SUFFIX in ('2014', '2015')
成功:没有通配符的正常语法
单表查询
select sum(trip_distance) from `bigquery-public-data.new_york_taxi_trips.tlc_green_trips_2014`
查询多个表:
select sum(trip_distance) from ( select trip_distance from `bigquery-public-data.new_york_taxi_trips.tlc_green_trips_2014` UNION ALL select trip_distance from `bigquery-public-data.new_york_taxi_trips.tlc_green_trips_2015` )
解决方案
当我尝试运行这个简单的查询时:
select trip_distance
from `bigquery-public-data.new_york_taxi_trips.tlc_green_trips_*`
where _TABLE_SUFFIX in ('2014')
limit 100
我收到错误消息:
查询失败
错误:无法将 FLOAT64 类型的字段“trip_distance”读取为 NUMERIC
我以前没有见过这个错误。数据在预览窗格中看起来不错。我只能假设基础数据中有些东西搞砸了。在 2014 年(假设数据是在那个时间范围内加载的),数据类型不可能是NUMERIC
- 所以我不知道从哪里来NUMERIC
。
不用说——鉴于该列根本无法读取——该列无法转换为我尝试过的任何其他类型。
我认为数据已损坏。我不确定在 Google 应该联系谁,但应该修复或删除它。
编辑:
我得到了它。数据NUMERIC
位于表格的最新版本(2018 年)中。问题在于*
语法。这是使用表的最新定义,并且存在类型不兼容(它可以进行转换,但不能)。
我想你已经弄清楚了如何独立查询每个表,所以你可以解决这个问题。
如果这是一个问题,因为您需要混合来自不同年份的数据,那么您可以创建一个视图来执行您需要的转换(尽管使用该视图可能会增加查询成本)。
推荐阅读
- excel - Vba 宏在家用电脑上运行,在工作电脑上出现错误 2147417848
- php - 使用 laravel 在全站范围内查找密集查询/页面
- spring - 两个实体之间的共享主键不起作用
- java - Java – 正则表达式 – 匹配开始和结束卷曲标签
- html - 使用 flex-start 和 flex-end 将图标固定到 flexbox 容器的角落
- javascript - 交换两个变量值的哪种方式更优化?
- python - 单击提交按钮时使用for循环无法获取文本框的所有值
- git - Fastlane git_commit 操作 - 如果没有要提交的内容则跳过
- google-cloud-firestore - 使用 exists() 的 Cloud Firestore 规则是否算作读取?
- regex - RegEx - 排除特定标签之间的随机字符串