Свести несколько столбцов одинакового размера в таблице BigQuery - PullRequest
0 голосов
/ 05 ноября 2019

У меня есть таблица с несколькими столбцами, где некоторые из них являются массивами одинаковой длины. Я хотел бы откатить их, чтобы получить результат со значениями из массивов в отдельных строках.

Итак, имея такую ​​таблицу:

input table

Я хотел бы получить:

output table

Вот как это работает для одного из этих столбцов массива:

WITH data AS
(
  SELECT 1001 as id, ['a', 'b', 'c'] as array_1, [1, 2, 3] as array_2
  UNION ALL
  SELECT 1002 as id, ['d', 'e', 'f', 'g'] as array_1, [4, 5, 6, 7] as array_2
  UNION ALL
  SELECT 1003 as id, ['h', 'i'] as array_1, [8, 9] as array_2
)
SELECT id, a1
FROM data,
UNNEST(array_1) as a1

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

Ответы [ 3 ]

1 голос
/ 05 ноября 2019

Ниже для BigQuery Standard SQL

#standardSQL
SELECT id, a1, a2
FROM data, UNNEST(array_1) AS a1 WITH OFFSET 
JOIN UNNEST(array_2) AS a2 WITH OFFSET
USING(OFFSET)
1 голос
/ 05 ноября 2019

Вы можете использовать with offset и join:

WITH data AS
(
  SELECT 1001 as id, ['a', 'b', 'c'] as array_1, [1, 2, 3] as array_2
  UNION ALL
  SELECT 1002 as id, ['d', 'e', 'f', 'g'] as array_1, [4, 5, 6, 7] as array_2
  UNION ALL
  SELECT 1003 as id, ['h', 'i'] as array_1, [8, 9] as array_2
)
SELECT id, a1, a2
FROM data cross join
     UNNEST(array_1) as a1 with offset n1 JOIN
     UNNEST(array_2) as a2 with offset n2 
     on n1 = n2
0 голосов
/ 06 ноября 2019

Таким образом, я провел небольшое исследование по удалению в SQL самостоятельно и придумал это решение:

WITH data AS
(
  SELECT 1001 as id, ['a', 'b', 'c'] as array_1, [1, 2, 3] as array_2
  UNION ALL
  SELECT 1002 as id, ['d', 'e', 'f', 'g'] as array_1, [4, 5, 6, 7] as array_2
  UNION ALL
  SELECT 1003 as id, ['h', 'i'] as array_1, [8, 9] as array_2
)
SELECT id, a1, array_2[OFFSET(off)] AS a2
FROM data
CROSS JOIN UNNEST(array_1) AS a1 WITH OFFSET off

Преимущество состоит в том, что оно не требует развертывания всех массивов, только одного.

...