Как объединить столбцы массива в массив структуры в BigQuery? - PullRequest
0 голосов
/ 20 июня 2019

Как мы можем построить массив struct, в котором каждая строка в массиве соответствует нескольким столбцам массива с одинаковым номером строки?

Я покажу вам пример того, что я имел в виду, чтобы лучше проиллюстрировать мою проблему.

Предположим, я хочу запросить таблицу с именем table_1, которая выглядит следующим образом: Example table

Таким образом, здесь 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

Обратите внимание, что значение 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

Спасибо.

1 Ответ

2 голосов
/ 20 июня 2019

Есть ли лучший и более простой способ достижения моей цели?

Ниже для BigQuery Standard SQL

#standardSQL
SELECT id, col_1,
  ARRAY(SELECT AS STRUCT col_2, col_3, col_4 
    FROM UNNEST(col_2) col_2 WITH OFFSET 
    JOIN UNNEST(col_3) col_3 WITH OFFSET USING(OFFSET)
    JOIN UNNEST(col_4) col_4 WITH OFFSET USING(OFFSET)
  ) comb_col,
  col_5
FROM `project.dataset.table`   

Возможно, это вопрос мнения, но для меня это выглядит менее многословно

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

Row id  col_1   comb_col.col_2  comb_col.col_3  comb_col.col_4  col_5    
1   1   a       x               1               s               4    
                y               2               t               5    
                z               3               u        
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...