Как мы можем построить массив struct, в котором каждая строка в массиве соответствует нескольким столбцам массива с одинаковым номером строки?
Я покажу вам пример того, что я имел в виду, чтобы лучше проиллюстрировать мою проблему.
Предположим, я хочу запросить таблицу с именем table_1, которая выглядит следующим образом:
![Example table](https://i.stack.imgur.com/83RbB.png)
Таким образом, здесь col_2, col_3, col_4 и col_5 - все столбцы массива в BigQuery. Я знаю, что col_2, col_3 и col_4 в table_1 всегда имеют одинаковое количество строк. И мне нужно объединить их в массив структур, в которых комбинация каждой строки в столбцах массива образует одну строку структуры в новом массиве. Таким образом, результирующий массив будет (x, 1, s), (y, 2, t) и (z, 3, u)
Предположим, этот объединенный столбец называется comb_col. Этот comb_col по сути является массивом структур. Каждая строка представляет собой структуру, состоящую из col_2, col_3 и col_4, как показано в таблице ниже:
![Example table2](https://i.stack.imgur.com/6LJqy.png)
Обратите внимание, что значение comb_col должно быть (x, 1, s), (y, 2, t) и (z, 3, u), а не ([x, y, z], [1, 2, 3], [s, t, u])
Какой самый простой способ сделать это? Я попытался использовать UNNEST с перекрестными соединениями, но это сделает CROSS JOIN, а не CONCATENATION (поэтому в приведенном выше примере будет создано 9 строк вместо 3 строк объединенных столбцов).
Я подумал об использовании номера строки также с ROW_NUMBER (), UNNEST с перекрестными объединениями, затем отфильтровал только те строки, имеющие тот же номер строки, как показано ниже. Мое решение достигает того, чего я хотел, однако решение немного многословно и сложно. Есть ли лучший и более простой способ достижения моей цели?
CREATE TEMP FUNCTION ADD_ROW_NUMBER(arr ANY TYPE) AS (
ARRAY(
SELECT AS STRUCT
data,
row_number() OVER () AS rn
FROM UNNEST(arr) data
)
);
SELECT
id,
col_1,
ARRAY(
(SELECT AS STRUCT
c2.data AS col_1,
c3.data AS col_2,
c4.data AS col_3
FROM
UNNEST(ADD_ROW_NUMBER(col_1)) c1,
UNNEST(ADD_ROW_NUMBER(col_2)) c2,
UNNEST(ADD_ROW_NUMBER(col_3)) c3
WHERE c1.rn = c2.rn AND c2.rn = c3.rn)
) AS comb_col,
col_5,
ARRAY(
SELECT
col_5 * 10
) AS col_5_times_10
FROM table_1
Спасибо.