查询BigQuery数据集中的最新表

use*_*734 3 google-bigquery

我有一个数据集,其中包含以yyyymmdd结尾的类似表名的表.例如:

myproject:mydataset.Sales20140815
myproject:mydataset.Sales20140816
myproject:mydataset.Sales20140817
myproject:mydataset.Sales20140818
...
myproject:mydataset.Sales20140903
myproject:mydataset.Sales20140904 
Run Code Online (Sandbox Code Playgroud)

有没有办法编写BigQuery来查询数据集中的最新表(对于上面的例子,它是myproject:mydataset.Sales20140904)?

小智 8

NN答案是好的,但是如果重新导入一组旧的数据会被错误地拉​​为"最新",则依赖于修改日期是有问题的因为table_id以正确的顺序明确列出日期,所以最好直接使用该值.

SELECT 
  *
FROM 
TABLE_QUERY(MyDATASET, 
      'table_id CONTAINS "MyTable" 
      AND table_id= (Select MAX(table_id) 
                              FROM MyDATASET.__TABLES__
                              where table_id contains "MyTable")'
            )
Run Code Online (Sandbox Code Playgroud)

  • `table_id = (select max(..) )` 总是会满足条件 `table_id contains "MyTable"` 所以不需要第一部分 (2认同)

Ale*_*kin 5

如果你必须使用标准方言(这是 BQ 团队强烈推荐的),它应该是这样的

#standardSQL
select * from `myproject:mydataset.*`
where _TABLE_SUFFIX = (select max(_TABLE_SUFFIX) from `myproject:mydataset.*`)
Run Code Online (Sandbox Code Playgroud)

这样做的一个好处是您还可以公开您在结果中查询的表名

#standardSQL
select _TABLE_SUFFIX source, t.* from `myproject:mydataset.*` t
where _TABLE_SUFFIX = (select max(_TABLE_SUFFIX) from `myproject:mydataset.*`) 
Run Code Online (Sandbox Code Playgroud)


Dav*_*ith 1

我能想到的唯一解决方案涉及对日常 ETL 的修改:

答:更新 ETL 以在加载或更新最新表后创建该表的副本。如果您使用 bq 命令行工具,则类似于:

bq cp mydataset.Sales20140904 mydataset.SalesLatestDay
Run Code Online (Sandbox Code Playgroud)

然后,您只需查询 SalesLatestDay 表即可。

B:更好的是,创建一个引用您最近的表(“SELECT * FROM mydataset.Sales20140904”)的视图,并每天更新它。有关使用 REST API 创建视图的信息: https://developers.google.com/bigquery/docs/reference/v2/tables#resource