Nested BigQuery SQL:将视图A中的子查询作为嵌套表嵌入视图B中
我正在尝试使用标准SQL将两个平面、相关的BigQuery视图中的数据合并到单个嵌套表体系结构中 我有两张类似的表格: 分析数据:全球时间跨度内每分钟一行Nested BigQuery SQL:将视图A中的子查询作为嵌套表嵌入视图B中,nested,google-bigquery,Nested,Google Bigquery,我正在尝试使用标准SQL将两个平面、相关的BigQuery视图中的数据合并到单个嵌套表体系结构中 我有两张类似的表格: 分析数据:全球时间跨度内每分钟一行 ------------------------------------------------------------------- minute_index | users | users_new | ... -----------------------------------------------------------------
-------------------------------------------------------------------
minute_index | users | users_new | ...
-------------------------------------------------------------------
1312017 | 8 | 3 | ...
1312018 | 9 | 2 | ...
1312019 | 5 | 1 | ...
1312020 | 3 | 0 | ...
1312021 | 5 | 2 | ...
1312023 | 4 | 3 | ...
1312024 | 7 | 4 | ...
1312025 | 6 | 3 | ...
1312026 | 9 | 4 | ...
事件数据:发生的每个外部事件对应一行
----------------------------------------
minute_index | event |
----------------------------------------
1312019 | "TV Spot Broadcast" |
1312023 | "Radio Spot Broadcast" |
1312026 | "Radio Spot Broadcast" |
我试图将它们合并到一个表中,其中新表中的每一行都包含分析表的子集,该子集跨越该表和以下几分钟(我们称之为5分钟):
-----------------------------------------------------------------------------
minute_index | event | window_treated |
-----------------------------------------------------------------------------
1312019 | "TV Spot Broadcast" | minute_index | users | users_new |
|------------------------------------
| 1312019 | 5 | 1 |
| 1312020 | 3 | 0 |
| 1312021 | 5 | 2 |
| 1312023 | 4 | 3 |
| 1312024 | 7 | 4 |
-----------------------------------------------------------------------------
1312023 | "Radio Spot Broadcast" | minute_index | users | users_new |
|------------------------------------
| 1312023 | 4 | 3 |
| 1312020 | 3 | 0 |
| 1312021 | 5 | 2 |
| 1312023 | 4 | 3 |
| 1312024 | 7 | 4 |
实际上,我已经能够像这样构造嵌套表了,但是只有通过构建和连接复杂的中间表集合,这些中间表显然比它们应该复杂得多,如果我只能在一个查询中找出如何做这类事情的话
这只是我尝试过的各种方法的一个例子
选择
时间戳作为时间戳,
ed.minute_索引作为minute_索引,
选择为结构
广告分钟索引,广告用户,广告用户新
来自'my_project.my_dataset.analytics_data'广告
其中ad.minute\u index>=ed.minute\u index
和ad.minute_索引Correlated subqueries that reference other tables are not supported unless they can be de-correlated, such as by transforming them into an efficient JOIN.
下面是BigQuery标准SQL
#standardSQL
SELECT
ed.minute_index,
event,
ARRAY_AGG(ad) window_treated
FROM `my_project.my_dataset.event_data` ed
JOIN `my_project.my_dataset.analytics_data` ad
ON ad.minute_index BETWEEN ed.minute_index AND ed.minute_index + 5
GROUP BY ed.minute_index, event
如果应用于您问题中的样本数据,结果如下
正如您所看到的,我严格遵循了错误消息中的建议,即不支持引用其他表的相关子查询,除非它们可以被解除相关,例如通过将它们转换为有效的联接。并将相关子查询转换为JOIN我在这里找到了一小部分接近但不完全正确的答案,比如这一个--但它们通常不能为我需要去哪里提供足够的指导。非常感谢,@mikhail-我真的希望你能插话;说得清楚一点,我确实明白这基本上是我需要做的,但是我尝试了你所描述的方法的几种变体,并且反复绕着轴,试图找出使用ARRAY_AGG、ARRAY‘with GROUP BY、SELECT AS STRUCT’等的确切语法。有道理。现在希望这个模式能在将来帮助你们:实际上,我认为我的一个核心问题是出于习惯而使用左连接,而不是裸连接/内部连接。我曾经尝试过与你的建议非常相似的东西,但是不断地被留下来。如果没有一个条件,即连接两边的字段相等,则不能使用外部连接。如果我对剩下的模式有足够的信心,我可能会马上意识到我应该使用一个内部连接,但当时我已经绞尽脑汁了,这只是又一个错误,这意味着我需要了解h-ll到底发生了什么。@LaurentStanevich-我知道你没有接受答案-有什么特别的原因吗?只是好奇不,一点也不。我认为这可能只是一个错误的点击。事实上,现在我正在考虑这个问题,我想这可能是我的新型触摸屏笔记本电脑的一个问题。我正在向我的儿子解释你的解决方案,他是一名计算机科学专业的学生,今年夏天和我一起实习。我猜,当我兴奋地在屏幕上做手势时,我可能无意中点击了复选标记。