我有一个数据集,其中包含以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)
如果你必须使用标准方言(这是 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)
我能想到的唯一解决方案涉及对日常 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
归档时间: |
|
查看次数: |
2533 次 |
最近记录: |