我尝试从包含project_id:dataset:dataset_20160101
,project_id:dataset:dataset_20160102
等表格的数据集中的最新表进行有效查询。
此查询似乎是推荐的解决方案:
SELECT *
FROM `project_id.dataset.*`
WHERE _TABLE_SUFFIX=(SELECT MAX(table_id) FROM `project_id.dataset.__TABLES_SUMMARY__`)
但是,此查询要求我访问数据集中的所有表,而不仅仅是最新的表。那是为什么?
答案 0 :(得分:0)
当WHERE子句在伪列上使用常量表达式时,我们只能在查询运行之前修剪表,例如_TABLE_SUFFIX ='dataset_20160102'。对于您的查询,由于WHERE子句包含一个不解析为常量的子uery,我们无法在查询运行之前修剪表。而是从所有表中读取数据并执行子查询。然后将数据与子查询结果连接并过滤。
可以在查询执行期间修剪表。启动查询,执行子查询,修剪表和读取数据。但是它还没有ETA。
答案 1 :(得分:0)
现在,如果你有一个插入表的管道,那么在管道的最后,你可以 (1)得到MAX(table_id) (2)使用以下查询创建视图:
SELECT
*,
DATE max_table_id AS _LATEST_DATE,
PARSE_DATE('%E4Y%m%d', _TABLE_SUFFIX) AS _DATA_DATE
FROM `project_id.dataset.*`
然后,只要您想查询数据,就可以只查询视图,并指定_DATA_DATE = _LATEST_DATE作为过滤器。在这种情况下,_LATEST_DATE是预先计算的,因此它是常量。正如华解释的那样,您只需要处理最新的表格。