sql - 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”
我不太明白为什么会这样,第一个查询返回一个日期。
解决方案
您收到错误是因为:
- 该表具有选项集:require_partition_filter=true,如果未指定分区过滤器,则对该表的查询应该失败。
- 使用子查询作为分区过滤器是有限制的,这里记录了限制。
通常,当过滤器可以在查询开始时进行评估而不需要任何子查询评估或数据扫描时,分区修剪将降低查询成本。
解决方法是使用 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
推荐阅读
- mysql - SQL查找最大计数
- com - mt.exe -replacements:未记录免注册 COM 组件的 xml 文件结构
- javascript - 如何设置类似 Instagram 的路线?本地主机:3000/用户名
- python - 在 Python 3.x 中转义特殊字符
- python - 用户创建指定类的对象
- java - 片段中的自定义列表视图。未找到布局
- azure-storage - 使用系统分配的托管标识将 Azure 流分析输出到 Data Lake Storage Gen2
- c++ - 用 C++ 读取文件,包括空格键
- object-detection - 在 sagemaker 中使用带有对象检测 API 的 tensorboard
- python-2.7 - 如何在unittest mock python中使用类变量条件