Как раскрутить два списка из двух столбцов в BigQuery без перекрестного продукта, как отдельные строки - PullRequest
0 голосов
/ 29 января 2020

У меня есть таблица в BigQuery, она имеет два столбца, каждый столбец содержит массив. для данной строки оба столбца будут содержать массивы одинаковой длины, но эта длина может варьироваться от строки к строке:

WITH tbl AS (
select ['a','b','c'] AS one, [1,2,3] as two
union all
select ['a','x'] AS two, [10,20] as two
)
select * from tbl

Таким образом, таблица будет выглядеть следующим образом:

row | one     | two
-----------------------
1   | [a,b,c] | [1,2,3]
2   | [a,x]   | [10,20]

Я хотел бы развернуть таким образом, чтобы каждая строка в новой таблице имела элемент массива из column1 и соответствующий элемент из column2. Так что из таблицы выше, я ищу получить:

row | one | two
---------
1   | a   | 1
2   | b   | 2
3   | c   | 3
4   | a   | 10
5   | x   | 20

Любая помощь будет высоко ценится! Спасибо!

1 Ответ

1 голос
/ 29 января 2020

ниже для BigQuery Standard SQL

#standardSQL
SELECT z.*
FROM `project.dataset.table` t,
UNNEST(ARRAY(
  SELECT AS STRUCT one, two
  FROM UNNEST(one) one WITH OFFSET
  JOIN UNNEST(two) two WITH OFFSET
  USING(OFFSET)
  )
) z

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

Row one two  
1   a   1    
2   b   2    
3   c   3    
4   a   10   
5   x   20     

I не полностью понимаю синтаксис, не могли бы вы объяснить это?

Объяснение:

  • Шаг 1

для каждой строки в таблице ниже массива вычисляется

ARRAY(
  SELECT AS STRUCT one, two
  FROM UNNEST(one) one WITH OFFSET
  JOIN UNNEST(two) two WITH OFFSET
  USING(OFFSET)
)  

Элементы этого массива являются структурами с соответствующим значением из двух столбцов - они сопоставляются друг с другом путем СОЕДИНЕНИЯ их позиций в исходных массивах (OFFSET)

  • Шаг 2

Затем этот массив получает UNNEST'ом и пересекается с JOIN'ом с соответствующей строкой в ​​таблице - и вся строка фактически игнорируется, и только эта структура (z) выводится в вывод

  • Шаг 3

И, наконец, для вывода не структуры, а отдельных столбцов - используется z.*

Надеюсь, это помогло: o)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...