从BigQuery中最新的时间戳分片表中查询的特殊字符

时间:2018-08-01 23:06:07

标签: google-cloud-platform google-bigquery

来自 https://cloud.google.com/bigquery/docs/partitioned-tables

您可以使用基于时间的命名方法(例如[PREFIX] _YYYYMMDD

)来分片表

这使我能够做到:

SELECT count(*) FROM `xxx.xxx.xxx_*` 

并查询所有分片。是否有仅查询最新分片的特殊符号?例如说我有:

  • xxx_20180726
  • xxx_20180801

我可以照做

SELECT count(*) FROM `xxx.xxx.xxx_{{ latest }}` 

查询xxx_20180801吗?

Mikhail Berlyant启发的单查询:

SELECT count(*) as c FROM  `XXX.PREFIX_*` WHERE _TABLE_SUFFIX IN (  SELECT
    SUBSTR(MAX(table_id), LENGTH('PREFIX_') + 2)
  FROM
    `XXX.__TABLES_SUMMARY__`
  WHERE
    table_id LIKE 'PREFIX_%')

1 个答案:

答案 0 :(得分:3)

如果您确实关心成本(意味着查询将扫描多少张表),那么唯一的方法是分两个步骤进行操作

    
  

第一个查询

#standardSQL
SELECT SUBSTR(MAX(table_id), LENGTH('PREFIX') + 1)
FROM `xxx.xxx.__TABLES_SUMMARY__`
WHERE table_id LIKE 'PREFIX%'
  

第二次查询

#standardSQL
SELECT COUNT(*)
FROM `xxx.xxx.PREFIX_*`
WHERE _TABLE_SUFFIX = '<result of first query>'      

因此,如果第一个查询的结果为20180801,那么第二个查询显然将如下所示

#standardSQL
SELECT COUNT(*)
FROM `xxx.xxx.PREFIX_*`
WHERE _TABLE_SUFFIX = '20180801'      

如果您不在乎成本,而只需要结果-您可以轻松地将上述两个查询合并为一个-但是-再一次-请记住-即使结果不在最后一个表中-成本将取决于您查询所有与xxx.xxx.PREFIX_*

匹配的表

忘了提及(尽管应该很明显):当然,当您的COUNT(1)中只有SELECT时,两个选项的成本均为0(零),但实际上-您很有可能会拥有比count(1)更有价值的东西