2014-09-04 79 views
3

我有一个包含以yyyymmdd结尾的类似表名的表的数据集。例如:查询BigQuery数据集中的最新表格

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

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

回答

2

只有我能想到涉及修改到你的日常ETL解决方案:

答:更新您的ETL创建的最新表的副本一旦它被装载或更新。如果您在使用BQ命令行工具,会是这样的:

bq cp mydataset.Sales20140904 mydataset.SalesLatestDay 

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

2

我会使用表通配符函数。 如果最新的是今天的表,使用

Select * from TABLE_DATE_RANG(MyDATASET.,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")' 
       ) 

希望这有助于...

2
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)") 
7

N.N.答案是好的,但依赖于修改日期是有问题的,如果一组旧数据被重新导入,将被错误地拉​​为“最新”。由于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")' 
      ) 
0

如果你的餐桌肯定是每天更新,这是我的伎俩。

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