在大查询数据集中选择最新表-标准SQL语法

时间:2018-09-11 22:52:33

标签: google-bigquery

我的数据集包含多个名称相似的表:

例如

affilinet_4221_first_20180911_204956
affilinet_4221_first_20180911_160004
affilinet_4221_first_20180911_085559
affilinet_4221_first_20180910_201323
affilinet_4221_first_20180910_201042
affilinet_4221_first_20180910_080006
affilinet_4221_first_20180909_160707

此查询使用 __ TABLES_SUMMARY __ 方法标识最新数据集(根据yyyymmdd_hhmmss命名约定)

SELECT max(table_id) as table_id FROM `modemutti-8d8a6.feed_first.__TABLES_SUMMARY__`
where table_id LIKE "affilinet_4221_first_%"

query result

此查询使用 _TABLE_SUFFIX 方法从特定表中提取所有值

SELECT * FROM `modemutti-8d8a6.feed_first.*`
WHERE _TABLE_SUFFIX = "affilinet_4221_first_20180911_204956"

query result

此查询结合了 __ TABLES_SUMMARY __ (返回affilinet_4221_first_20180911_204956)和 _TABLE_SUFFIX

SELECT * FROM `modemutti-8d8a6.feed_first.*`
WHERE _TABLE_SUFFIX = (
            SELECT max(table_id) FROM `modemutti-8d8a6.feed_first.__TABLES_SUMMARY__`
            where table_id LIKE "affilinet_4221_first_%")

此查询失败:

  

错误:无法将INT64类型的字段'modemio_cat_level'读取为STRING

error screenshot

知道为什么会这样或我如何解决该问题吗?

------------编辑------------

@Mikhail解决方案可以正常工作,但可以处理大量数据。请参见explicit callsuggested Method。另一个解决方案是

SELECT * FROM  `modemutti-8d8a6.feed_first.affilinet_4221_first_*` WHERE _TABLE_SUFFIX = 
    ( 
    SELECT MAX(_TABLE_SUFFIX)  FROM`modemutti-8d8a6.feed_first.affilinet_4221_first_*`
    )

但是this处理的数据也比显式查询大得多。是否可以通过UI中的视图来实现,还是应该通过API使用Python / Java SDK?

1 个答案:

答案 0 :(得分:2)

尝试以下

#standardSQL
SELECT * FROM `modemutti-8d8a6.feed_first.affilinet_4221_first_*`
WHERE _TABLE_SUFFIX = (
    SELECT REPLACE(MAX(table_id), 'affilinet_4221_first_', '') 
    FROM `modemutti-8d8a6.feed_first.__TABLES_SUMMARY__`
    WHERE table_id LIKE "affilinet_4221_first_%"
)