我有一个查询希望变成一个视图。该查询取决于几个子查询,看起来像这样:
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_ *内的“分区”数内联的数据的大约千分之一
答案 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将处理更少的数据量。