【问题标题】:Bigquery apply subquery to partition timeBigquery 将子查询应用于分区时间
【发布时间】:2020-11-27 12:09:36
【问题描述】:

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

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”

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

【问题讨论】:

    标签: sql google-bigquery


    【解决方案1】:

    您收到错误是因为:

    1. 该表设置了选项:require_partition_filter=true,如果未指定分区过滤器,则对该表的查询将失败。
    2. 使用子查询作为分区过滤器存在限制,该限制记录在here

    一般来说,如果可以在查询开始时评估过滤器而不需要任何子查询评估或数据扫描,分区修剪将降低查询成本。

    解决方法是使用 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
    

    【讨论】:

    • 太棒了!非常感谢。
    猜你喜欢
    • 2019-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多