BigQuery SQL: встраивание подзапросов из представления A в виде вложенных таблиц в представлении B - PullRequest
0 голосов
/ 10 июля 2019

Я пытаюсь объединить данные из двух плоских связанных представлений BigQuery в архитектуру с одной вложенной таблицей, используя стандартный SQL

У меня есть две аналогичные таблицы:

Данные аналитики: Одна строка для каждой минуты в глобальном временном интервале

-------------------------------------------------------------------
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"  |

I'mпытаясь объединить их в одну таблицу, где каждая строка в новой таблице содержит подмножество таблицы Analytics, которое охватывает это и некоторое количество следующих минут (назовем это 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 |

Iна самом деле удалось построить вложенные таблицы, как это, но только путем создания и объединения извилистых наборов промежуточных таблиц, которые явно намного сложнее, чем они должны быть, если я могу только выяснить, как это сделатьчто-то вроде одного запроса.

Это всего лишь один пример различных подходов, которые я пробовал ...

SELECT
  ed.timestamp AS timestamp,
  ed.minute_index AS minute_index,
  (SELECT AS STRUCT 
     ad.minute_index, ad.users, ad.users_new
   FROM `my_project.my_dataset.analytics_data` ad 
   WHERE (ad.minute_index >= ed.minute_index) 
      AND (ad.minute_index < (ed.minute_index + 5))
   ORDER BY
      ed.minute_index) AS units_treated
FROM
  `my_project.my_dataset.event_data` ed

, но это также один из нескольких, которые казались закрыть , но все приводят к одной и той же ошибке валидатора:

Correlated subqueries that reference other tables are not supported unless they can be de-correlated, such as by transforming them into an efficient JOIN.

1 Ответ

1 голос
/ 10 июля 2019

Ниже для BigQuery Standard 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   

Если применить к образцу данных из вашего вопроса - результат будет как ниже

enter image description here

Как видите - я буквально последовал предложению в сообщении об ошибке Correlated subqueries that reference other tables are not supported unless they can be de-correlated, such as by transforming them into an efficient JOIN. и преобразовал correlated subquery в JOIN

...