带有日期列的 BigQuery 标准 SQL 表通配符
Posted
技术标签:
【中文标题】带有日期列的 BigQuery 标准 SQL 表通配符【英文标题】:BigQuery standard SQL table wildcards with date columns 【发布时间】:2017-06-08 22:02:44 【问题描述】:当我在 BigQuery 网页界面中使用日期列,在标准 SQL 中使用表通配符进行查询时,我遇到了错误。
这行得通:
#standardSQL
SELECT
sale_item,
date_of_sale
FROM `my-project.past_sales.sales_20170601`
limit 100
这不是:
#standardSQL
SELECT
sale_item,
date_of_sale
FROM `my-project.past_sales.sales_*`
WHERE _TABLE_SUFFIX BETWEEN "20170530" AND "20170601"
limit 100
列date_of_sale
是DATE
类型,而sale_item
是STRING
类型。错误是:Error: Invalid adaptation for field: date_of_sale (message Msg_0_CLOUD_QUERY_TABLE). Cannot change from TYPE_STRING to int32
【问题讨论】:
【参考方案1】:这意味着date_of_sale
在一个表中是DATE
,在另一个表中是STRING
。你可以通过联合来找到罪魁祸首:
#standardSQL
SELECT * FROM `my-project.past_sales.sales_20170530` UNION ALL
SELECT * FROM `my-project.past_sales.sales_20170531` UNION ALL
SELECT * FROM `my-project.past_sales.sales_20170601`;
您实际上不需要运行查询; UI 中的验证器将指示不匹配的列类型在哪里。
要修复错误,您可以重新生成问题日的数据,应用强制转换,或者您可以使用联合运行查询,而不是在其中添加显式强制转换。例如,假设20170531
的表的列是STRING
,您可以这样做:
#standardSQL
SELECT
sale_item,
date_of_sale
FROM (
SELECT *
FROM `my-project.past_sales.sales_*`
WHERE _TABLE_SUFFIX BETWEEN "20170530" AND "20170601" AND
_TABLE_SUFFIX != 20170531
) UNION ALL
SELECT * REPLACE(CAST(date_of_sale AS DATE) AS date_of_sale)
FROM `my-project.past_sales.sales_20170531`
LIMIT 100;
【讨论】:
以上是关于带有日期列的 BigQuery 标准 SQL 表通配符的主要内容,如果未能解决你的问题,请参考以下文章
标准 SQL (BigQuery) 中整数 YYYYMMDD 的日期
在 bigquery 标准 sql 上提取两个日期之间的小时数
如何在 BigQuery 的标准 SQL 中解析具有不同日期字符串的列中的值