如何定义引用子查询中的通配符表的BQ视图?

时间:2018-07-09 14:48:09

标签: google-bigquery

我有一个查询希望变成一个视图。该查询取决于几个子查询,看起来像这样:

WITH subquery1 AS (
  date,
  key1,
  key2,  
  other_fields,
  ....
), subquery2 AS (
  date,
  key1,
  key2,  
  other_fields,
  ....
)

SELECT
  date,
  key1,
  key2,
  other_fields...
FROM table
JOIN subquery1 USING(key1, key2)
JOIN subquery2 USING(key1, key2)

每个子查询都引用相同的Google Analytics(分析)会话数据,这些数据分为“数据分区”表,那些具有相同表前缀和在日期字段中引用的后缀“ yyyymmdd”的表。

我希望该视图能够在所有子查询中以及在直接查询表时(如显示的查询中一样)选择相关的日期表分区。

我没有有效的代码-我开始认为这是不可能的,可能是因为它涉及相关的子查询。

这不可能吗?或者,如果可能的话,什么样的结构/语法可以实现?

更新

动机是限制查询中选择的数据量。在选择一些最近的日期时,我可以将选择的数据量限制在500GB到数十GB之间。

要重申-这些不是正式的日期分区表,它们是一系列带有通用前缀且均以yyyymmdd格式结尾的单独表。我毫无疑问地选择了这些范围,但是我认为这对我定义视图没有帮助。

更新2

这是我尝试过的方法,但是查询不同日期不会影响所选数据量:

WITH revenue AS(
  SELECT DISTINCT 
    key1,
    key2,
    date,
    transactions,
    revenue
  FROM `project.dataset.revenue` AS main
)

SELECT
  _TABLE_SUFFIX AS date,
  main.key1 AS m_fvi,
  main.key2 AS m_vi,
  revenue.transactions,
  revenue.revenue
FROM `project.dataset.ga_sessions_*` AS main
LEFT JOIN revenue USING(key1, key2)
WHERE REGEXP_CONTAINS(_TABLE_SUFFIX, r'[0-9]{8}')

消费查询:

SELECT  
  *
FROM `project.dataset.view`
WHERE date = '20180701'

选择与以下相同数量的数据:

SELECT  
  *
FROM `project.dataset.view`

它应该选择与ga_sessions_ *内的“分区”数内联的数据的大约千分之一

1 个答案:

答案 0 :(得分:0)

用户@ElliottBrossard在评论中建议使用_TABLE_SUFFIX。这是您尝试做的正确方法。查询视图和预期的帐单结果时会产生混乱。

使用_TABLE_SUFFIX可以正确创建视图。它从正确的表中获取正确的数据,并将其置于新视图中。现在,运行带有WHERE子句的查询:

SELECT *
FROM `project.dataset.view`
WHERE date = '20180701'

此查询将读取包含与正则表达式REGEXP_CONTAINS(_TABLE_SUFFIX, r'[0-9]{8}')匹配的所有表的整个视图,然后过滤出与WHERE子句不匹配的结果。第二个查询执行的操作基本上相同,但减去过滤后的结果。这意味着BigQuery正在处理的数据量在两个查询中都是相同的,从而导致两个查询的计费量相同。

我所理解的解决方案是为每个表创建一个后缀为'yyyymmdd'的视图。这样,当您查询所需时间戳的视图时,BigQuery将处理更少的数据量。