【问题标题】:BigQuery Wildcard using TABLE_DATE_RANGE()使用 TABLE_DATE_RANGE() 的 BigQuery 通配符
【发布时间】:2026-01-13 13:05:02
【问题描述】:

今早关于新表通配符函数的好消息!有没有办法在包含日期但没有前缀的表上使用 TABLE_DATE_RANGE()?

我有一个数据集,其中包含名为 YYYYMMDD(无前缀)的表。通常我会这样查询:

SELECT foo 
FROM [mydata.20140319],[mydata.20140320],[mydata.20140321] 
LIMIT 100

我尝试了以下方法,但出现错误:

SELECT foo
FROM 
  (TABLE_DATE_RANGE(mydata., 
                TIMESTAMP('2014-03-19'), 
                TIMESTAMP('2015-03-21')))
LIMIT 100

还有:

SELECT foo
FROM 
  (TABLE_DATE_RANGE(mydata, 
                TIMESTAMP('2014-03-19'), 
                TIMESTAMP('2015-03-21')))
LIMIT 100

【问题讨论】:

标签: google-bigquery


【解决方案1】:

此处的潜在错误已于 2015 年 5 月 14 日修复。您应该能够将TABLE_DATE_RANGE 与纯数字表名称一起使用。您需要以“。”结束数据集。并将名称括在括号中,以便解析器不会抱怨。这应该有效:

SELECT foo
FROM 
  (TABLE_DATE_RANGE([mydata.], 
                TIMESTAMP('2014-03-19'), 
                TIMESTAMP('2015-03-21')))
LIMIT 100

【讨论】:

  • 当我采用这种方法时,我收到“时间戳评估:结果为 NaN 或 NULL”错误。
【解决方案2】:

注意:底层错误已修复,请参阅我的其他答案。 原始响应留给后代(因为解决方法应该仍然有效,以防您出于某种原因需要它)

很好的问题。这应该可以,但目前还不行。我已经提交了一个内部错误。同时,一种解决方法是使用TABLE_QUERY 函数,如下所示:

SELECT foo
FROM (
  TABLE_QUERY(mydata,
              "TIMESTAMP(table_id) BETWEEN "
               + "TIMESTAMP('2014-03-19') "
               + "AND TIMESTAMP('2015-03-21')"))

【讨论】:

  • 每天有数据表有什么好处?
  • 很多用户喜欢按天对数据进行分区,以便于表管理(旧表可以删除),并且他们可以运行成本更低的查询(因为您只需要在需要的天数内进行查询)。
  • 有没有办法自动创建基于 fly 或第一次插入的重复模式?否则,您最终需要为每个分区创建架构。
【解决方案3】:

请注意,借助 BigQuery 中的standard SQL 支持,您可以使用_TABLE_SUFFIX,而不是TABLE_QUERY。例如:

SELECT foo
FROM `mydata_*`
WHERE _TABLE_SUFFIX BETWEEN '20140319' AND '20150321'

另请查看question,了解有关 BigQuery 标准 SQL 的更多信息。

【讨论】:

  • 这个答案很无聊,不清楚 'mydata' 是数据集名称还是表名称,在这两种情况下,它都不适用于带有 BigQuery 的标准 SQL。
  • 我正在使用mydata,就像问题中使用的那样。它指的是表id,在标准SQL中通常格式为project_id.dataset_id.table_id
最近更新 更多