# #sql #google-bigquery #nested
#sql #google-bigquery #вложенный
Вопрос:
Я пытаюсь создать таблицу BigQuery, основанную на различных других наборах данных. Таким образом, я хочу объединить данные из разных таблиц. В одной из моих исходных таблиц есть вложенный столбец, который я хочу включить. Для этого BigQuery говорит мне сначала удалить столбец, прежде чем получить к нему доступ. Мне это кажется нелогичным, так как я хочу включить его в качестве вложенного столбца в свою итоговую таблицу. Сейчас я использую запрос, упомянутый ниже, в ID
качестве первичного ключа и nestedColumn
вложенного столбца, но мне кажется странным сначала отменить, а затем агрегировать его.
Так что мне любопытно, это правильный путь? Или есть лучший/более чистый/более интуитивно понятный вариант? Я совсем новичок в SQL, поэтому, пожалуйста, извините меня, если я недостаточно объяснил это.
Таблица 1:
| ID | Column2 | | --- | ----------- | | 1 | someString1 | | 2 | someString2 | | 3 | someString3 | | 4 | someString4 | | 5 | someString5 |
Таблица 2:
| ID | nestedColum | | --- | ----------- | | 1 | aaa | | 1 | aab | | 2 | aaa | | 3 | abc | | 4 | bcd |
Которые после присоединения должны уступить:
| ID | nestedColum | Column2 | | --- | ----------- | ------------ | 1 | aaa | someString1 | | | aab | | | 2 | aaa | someString1 | | 3 | abc | someString1 | | 4 | bcd | someString1 |
Запрос:
WITH firstTable AS ( SELECT ID FROM table1 ), secondTable AS( SELECT ID, ARRAY_AGG(h.reference IGNORE NULLS) AS nestedColumn FROM table2, UNNEST (lines) AS h GROUP BY 1 ) SELECT firstTable.ID, secondTable.ID, secondTable.reference FROM firstTable JOIN secondTable ON firstTable.ID = secondTable.ID
ниже приводится MWE. В «реальных» данных столбец вложенности, конечно, вложен. Но поскольку в этом весь вопрос, я действительно не знаю, как это настроить.
CREATE OR REPLACE TABLE table1 ( ID int, column2 string); CREATE OR REPLACE TABLE table2 ( ID int, nestedColumn string ); INSERT INTO table1 ( ID, column2 ) VALUES (1, 'something1'), (2, 'something2'), (3, 'something3'), (4, 'something4'), (5, 'something5') ; INSERT INTO table2 ( ID, nestedColumn ) VALUES (1, 'aaa'), (1, 'aab'), (2, 'aaa'), (3, 'abc'), (4, 'abd'); SELECT * FROM table1 JOIN table2 ON table1.ID = table2.ID Order by table1.ID
Комментарии:
1. можете ли вы привести минимальный воспроизводимый пример? ожидаемый результат также был бы более чем желанным.
2. @AleixCC Я добавил свой оригинальный пост. Надеюсь, это немного прояснит мой вопрос.
3. Не могли бы вы предоставить схему обеих таблиц, т. е. таблицы 1 и таблицы 2, представленных в BigQuery, поскольку это поможет в репликации.
4. В вашем примере «Вложенный столбец» не вложен в массивы, это просто строка.