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

And*_*idy 4 google-bigquery google-cloud-platform

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

您可以使用基于时间的命名方法(例如 [PREFIX]_YYYYMMDD)对表进行分片

这使我能够做到:

SELECT count(*) FROM `xxx.xxx.xxx_*` 
Run Code Online (Sandbox Code Playgroud)

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

  • xxx_20180726
  • xxx_20180801

我可以做一些类似的事情吗

SELECT count(*) FROM `xxx.xxx.xxx_{{ latest }}` 
Run Code Online (Sandbox Code Playgroud)

查询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_%')
Run Code Online (Sandbox Code Playgroud)

Mik*_*ant 6

如果您确实关心成本(意味着您的查询将扫描多少表) - 这样做的唯一方法是分两步进行,如下所示

第一次查询

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

第二次查询

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

所以,如果第一个查询的结果是20180801这样,第二个查询显然如下所示

#standardSQL
SELECT COUNT(*)
FROM `xxx.xxx.PREFIX_*`
WHERE _TABLE_SUFFIX = '20180801'      
Run Code Online (Sandbox Code Playgroud)

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

忘了提及(即使它应该是显而易见的):当然,当你只有COUNT(1)你的SELECT- 两种选择的成本都是 0(零) - 但实际上 - 很可能你会拥有比计数更有价值的东西(1 )