旧版 SQL 中的表修饰器

通常,BigQuery 会在运行查询时执行全面列扫描。 您可以使用旧版 SQL 中的表修饰器来对部分数据执行经济有效的查询。无论何时读取表(例如复制表、导出表或使用 tabledata.list 列出数据时),您都可以使用表修饰器。

表修饰器支持相对和绝对 <time> 值。相对值用负数表示,绝对值用正数表示。例如,-3600000 表示相对于当前时间的一个小时以前(以毫秒为单位);3600000 表示 1970 年 1 月 1 日之后的一个小时(以毫秒为单位)。

时间修饰器

时间修饰器(以前称为快照修饰器)引用某个时间点的表历史数据。

语法

@<time>
  • 引用 <time>(以毫秒为单位,从 Epoch 起算)时间点的表历史数据。
  • <time> 必须在最近 7 天范围内,且不得早于表的创建时间,但必须早于表的删除或到期时间。
  • @0 是一种特殊情况,它引用表可用的最早数据。

时间修饰符也用于旧版 SQL 之外。您可以在表删除后的七天内通过 bq cp 命令使用它们来恢复已删除的表](/bigquery/docs/managing-tables#undeletetable)。

示例

如需获取一小时前某个表的历史数据,请使用以下语句:

相对值示例

#legacySQL
SELECT COUNT(*) FROM [PROJECT_ID:DATASET.TABLE@-3600000]

绝对值示例

  1. 获取一小时前对应的 <time>

    #legacySQL
    SELECT INTEGER(DATE_ADD(USEC_TO_TIMESTAMP(NOW()), -1, 'HOUR')/1000)
    
  2. 然后,替换以下查询中的 <time>

    #legacySQL
    SELECT COUNT(*) FROM [PROJECT_ID:DATASET.TABLE@time]
    

范围修饰器

语法

@<time1>-<time2>
  • 引用 <time1><time2>(以毫秒为单位,从 Epoch 起算)期间添加的表数据。
  • <time1><time2> 必须在过去 7 天内。
  • <time2> 是可选项,默认值为“now”。

示例

相对值示例

如需获取一小时前到半小时前之间添加的表数据,请运行以下命令:

#legacySQL
SELECT COUNT(*) FROM [PROJECT_ID:DATASET.TABLE@-3600000--1800000]

如需获取最近 10 分钟的数据,请运行以下命令:

#legacySQL
SELECT COUNT(*) FROM [PROJECT_ID:DATASET.TABLE@-600000-]

绝对值示例

如需获取一小时前到半小时前之间添加的表数据,请运行以下命令:

  1. 获取一小时前对应的 <time1>

    #legacySQL
    SELECT INTEGER(DATE_ADD(USEC_TO_TIMESTAMP(NOW()), -1, 'HOUR')/1000)
    
  2. 获取半小时前对应的 <time2>

    #legacySQL
    SELECT INTEGER(DATE_ADD(USEC_TO_TIMESTAMP(NOW()), -30, 'MINUTE')/1000)
    
  3. 替换以下查询中的 <time1><time2>

    #legacySQL
    SELECT COUNT(*) FROM [PROJECT_ID:DATASET.TABLE@time1-time2]