【发布时间】:2018-07-09 14:48:08
【问题描述】:
我有一个想要转换为视图的查询。该查询依赖于几个子查询,看起来像这样:
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”,在日期字段中引用。
我希望视图能够在所有子查询中选择相关的日期表分区,并且在直接查询表时,如显示的查询中所示。
我没有工作代码 - 我开始认为这是不可能的,可能是因为它涉及相关的子查询。
这不可能吗?或者如果可能的话,什么样的结构/语法可以实现它?
更新
动机是限制查询中选择的数据量。在选择最近的几个日期时,我可以将选择的数据量限制在 500 GB 到数十 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`
它应该选择大约 1000 分之一的数据,这些数据与 ga_sessions_* 中的“分区”数量一致
【问题讨论】:
-
我不确定我是否完全理解你的问题。是什么让 dat 表分区与查询相关?建造时间?您是否尝试过以下列方式使用 _PARTITIONTIME?例如
... WHERE _PARTITIONTIME BETWEEN TIMESTAMP_TRUNC(TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 * 24 HOUR),DAY) AND TIMESTAMP_TRUNC(CURRENT_TIMESTAMP(),DAY);这是一些关于查询分区表的附加文档cloud.google.com/bigquery/docs/querying-partitioned-tables -
感谢您的回复丽莎 - 我在我的问题中添加了一些说明。架构是 GA 导出架构support.google.com/analytics/answer/3437719?hl=en 我不认为这些是正式意义上的分区(我在澄清中解释)。它们是相关的,因为它们将有助于限制我需要选择的数据量。我只是不知道如何通过视图的子查询来处理它。
-
您只需要在 SELECT 列表中包含
_TABLE_SUFFIX并给它一个不同的名称。 -
感谢您的意见@ElliottBrossard - 我不确定我哪里出错了。我在问题的更新中展示了我的“最佳尝试”。它使用 _TABLE_SUFFIX 但仍然从所有底层分区中选择所有数据。
-
嗨!您是否能够通过 cmets 建议解决问题,或者您仍在尝试修复查询?
标签: google-bigquery