【发布时间】:2016-06-06 18:14:44
【问题描述】:
在旧版SQL 中,用户可以使用TABLE_DATE_RANGE、TABLE_QUERY 和TABLE_DATE_RANGE_STRICT 等表通配符函数。
标准SQL有类似的功能吗?
【问题讨论】:
标签: google-bigquery
在旧版SQL 中,用户可以使用TABLE_DATE_RANGE、TABLE_QUERY 和TABLE_DATE_RANGE_STRICT 等表通配符函数。
标准SQL有类似的功能吗?
【问题讨论】:
标签: google-bigquery
在旧版 SQL 中,用户可以使用表通配符函数引用数据集中表子集的数据。在标准 SQL 中,用户可以使用UNION ALL 获得相同的结果。但是,当用户希望使用日期范围(在旧版 SQL 中使用 TABLE_DATE_RANGE 和 TABLE_DATE_RANGE_STRICT 支持)或其他复杂条件(由 @987654326 支持)来动态确定表集时,此方法可能不方便@ 在旧版 SQL 中)。对于标准 SQL,BigQuery 提供了与下面描述的等效项。
可以使用标准 SQL 重写以下使用 TABLE_QUERY 通配符函数的旧 SQL 查询。
旧版 SQL 查询(使用 TABLE_QUERY):
SELECT SUM(value1)
FROM TABLE_QUERY([myproject:mydataset],"table_id = 'mydailytable_20150105' OR
table_id = 'mydailytable_20150106' OR table_id = 'maydailytable_20150110'")
GROUP BY value2;
旧版 SQL 查询(使用 TABLE_DATE_RANGE):
SELECT SUM(value1)
FROM TABLE_DATE_RANGE([myproject:mydataset], TIMESTAMP("2015-01-05"), TIMESTAMP("2015-01-10"))
标准 SQL 查询:
SELECT SUM(value1)
FROM `myproject.mydataset.mydailytable_*`
WHERE _TABLE_SUFFIX = '20150105'
OR _TABLE_SUFFIX = '20150106'
OR _TABLE_SUFFIX = '20150110'
GROUP BY value2;
在上述查询中,通配符表myproject.mydataset.mydailytable_* 匹配数据集中myproject.mydataset 中所有具有table_id 以mydailytable_ 开头的表。例如,要匹配数据集中的所有表,用户可以使用空前缀作为通配符。所以,myproject.mydataset.* 匹配数据集中的所有表。
由于* 是一个特殊字符,因此在查询中使用通配符表名时必须用引号引起来。
_TABLE_SUFFIX 伪列:
_TABLE_SUFFIX 伪列的类型为 STRING,可以像任何其他列一样使用。它是一个保留的列名,因此在将其用作 SELECT 列表的一部分时需要为其加上别名。
此功能的官方文档可在此处获得:
https://cloud.google.com/bigquery/docs/wildcard-tables https://cloud.google.com/bigquery/docs/querying-wildcard-tables
【讨论】:
mydataset.mytable_2015* WHERE _TABLE_SUFFIX BETWEEN '0521' 和 '0614' ?如果您想要 2015 年 6 月 15 日到 2016 年 6 月 14 日,查询将是:SELECT ... FROM mydataset.mytable_* WHERE _TABLE_SUFFIX BETWEEN '20150615' AND '20160614'