首页 > 解决方案 > Bigquery 将子查询应用于分区时间

问题描述

我有两个单独工作正确的查询,但一起出现错误:

WITH minimum_time AS 
(
    SELECT DATE (min(_PARTITIONTIME)) AS minimums
    FROM `Day`
    WHERE DATE (_PARTITIONTIME) = "2020-11-20"
)
SELECT *
FROM `Day`
WHERE DATE (_PARTITIONTIME) > (SELECT minimums
                               FROM minimum_time)

我得到这个错误:

如果没有筛选列“_PARTITION_LOAD_TIME”、“_PARTITIONDATE”、“_PARTITIONTIME”(可用于分区消除),则无法查询表“Day”

我不太明白为什么会这样,第一个查询返回一个日期。

标签: sqlgoogle-bigquery

解决方案


您收到错误是因为:

  1. 该表具有选项集:require_partition_filter=true,如果未指定分区过滤器,则对该表的查询应该失败。
  2. 使用子查询作为分区过滤器是有限制的,这里记录了限制。

通常,当过滤器可以在查询开始时进行评估而不需要任何子查询评估或数据扫描时,分区修剪将降低查询成本。

解决方法是使用 BigQuery 脚本来预先确定分区过滤器,例如:

DECLARE minimums DATE DEFAULT ((SELECT minimums FROM `Day` WHERE ...));
SELECT *
FROM `Day`
WHERE DATE (_PARTITIONTIME) > minimums; -- minimums is a constant to the second query

推荐阅读