使用来自联接表的引用查询BigQuery中的分区表

时间:2018-07-31 10:44:43

标签: google-bigquery

我想运行一个查询,该查询使用表B中的值对表A进行分区。 例如:

#standard SQL
select A.user_id
from my_project.xxx A
inner join my_project.yyy B
on A._partitiontime = timestamp(B.date)
where B.date = '2018-01-01'

此查询将扫描表A中的所有分区,并且不会考虑我在where子句中指定的日期(出于分区目的)。我尝试以几种不同的方式运行此查询,但都产生了相同的结果-扫描表A中的所有分区。 有什么办法解决吗?

谢谢。

2 个答案:

答案 0 :(得分:0)

doc says关于您的用例的信息:

  

使谓词过滤器尽可能接近表   标识符。需要评估多个的复杂查询   查询阶段以解析谓词(例如内部   查询或子查询)将不会从查询中删除分区。

以下查询不修剪分区(请注意使用子查询):

#standardSQL
SELECT
  t1.name,
  t2.category
FROM
  table1 t1
INNER JOIN
  table2 t2
ON
  t1.id_field = t2.field2
WHERE
  t1.ts = (SELECT timestamp from table3 where key = 2)

答案 1 :(得分:0)

使用BigQuery scripting(现在是Beta版),有一种方法可以修剪分区。

基本上,已定义脚本变量以捕获子查询的动态部分。然后在随后的查询中,脚本变量用作过滤器以修剪要扫描的分区。

DECLARE date_filter ARRAY<DATETIME> 
  DEFAULT (SELECT ARRAY_AGG(date) FROM B WHERE ...);

select A.user_id
from my_project.xxx A
inner join my_project.yyy B
on A._partitiontime = timestamp(B.date)
where A._partitiontime IN UNNEST(date_filter)