Google bigquery 在BigQuery数据集中查询最新的表

Google bigquery 在BigQuery数据集中查询最新的表,google-bigquery,Google Bigquery,我有一个数据集,其中包含以yyyymmdd结尾的表名相似的表。例如: myproject:mydataset.Sales20140815 myproject:mydataset.Sales20140816 myproject:mydataset.Sales20140817 myproject:mydataset.Sales20140818 ... myproject:mydataset.Sales20140903 myproject:mydataset.Sales20140904 是否有任何

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

myproject:mydataset.Sales20140815
myproject:mydataset.Sales20140816
myproject:mydataset.Sales20140817
myproject:mydataset.Sales20140818
...
myproject:mydataset.Sales20140903
myproject:mydataset.Sales20140904 

是否有任何方法可以编写BigQuery来查询数据集中的最新表(对于上面的示例,它是myproject:mydataset.Sales20140904)?

我能想到的唯一解决方案是修改您的日常ETL:

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

bq cp mydataset.Sales20140904 mydataset.SalesLatestDay
然后您只需查询SalesLatestDay表

B:更好的方法是,创建一个引用最新表的视图(“SELECT*fromMyDataSet.Sales20140904”),并每天更新。有关使用REST API创建视图的信息:
我会使用表通配符函数。 如果最新版本是今天的表格,请使用

Select * from TABLE_DATE_RANGE(MyDATASET.PREFIX, Current_Timestamp(), Current_Timestamp())
如果上次更改的表可能是过去的日期。您可以使用:

    SELECT 
      *
    FROM 
    TABLE_QUERY(MyDATASET, 
          'table_id CONTAINS "MyTable" 
          AND last_modified_time= (Select MAX(last_modified_time) 
                                  FROM MyDATASET.__TABLES__
                                  where table_id contains "MyTable")'
                )

希望这能有所帮助……

N.N.答案是好的,但如果重新导入一组旧数据,并将其误拉为“最新数据”,则依赖修改日期是有问题的,因为表id以正确的顺序明确列出了日期,最好直接使用该值

SELECT * 
FROM TABLE_QUERY(myproject:mydataset,
  "table_id IN (
     SELECT table_id FROM myproject:mydataset.__TABLES__  
     WHERE REGEXP_MATCH(table_id, r"^Sales.*")
     ORDER BY creation_time DESC LIMIT 1)")
SELECT 
  *
FROM 
TABLE_QUERY(MyDATASET, 
      'table_id CONTAINS "MyTable" 
      AND table_id= (Select MAX(table_id) 
                              FROM MyDATASET.__TABLES__
                              where table_id contains "MyTable")'
            )

如果你的桌子每天都在更新,下面是我的窍门

SELECT * FROM TABLE_DATE_RANGE(myproject:mydataset.Sales, CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP())

如果您必须使用标准方言(这是BQ团队极力推荐的),应该是这样的

#standardSQL
select * from `myproject:mydataset.*`
where _TABLE_SUFFIX = (select max(_TABLE_SUFFIX) from `myproject:mydataset.*`)
这样做的一个好处是,您还可以公开在结果中查询的表名

#standardSQL
select _TABLE_SUFFIX source, t.* from `myproject:mydataset.*` t
where _TABLE_SUFFIX = (select max(_TABLE_SUFFIX) from `myproject:mydataset.*`) 
table_id=(选择max(..)
始终将满足条件
table_id包含“MyTable”
,因此不需要第一部分