Функция разделения по нескольким полям в BigQuery SQL - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть такие данные:

enter image description here

В каждом столбце будет одинаковое количество элементов в строке, где первый элемент в первом столбце соответствует первому элементу во втором столбце и т. Д.

Как я могу сгладить это, чтобы получить ниже?

enter image description here

С одним столбцом я могу сделать это, комбинируя CROSS JOIN с UNNEST, но я не могу заставить это работать с несколькими столбцами, так как объединение приводит к созданию нескольких вариантов, а UNNEST теряет порядок массив, поэтому я не могу сопоставить их.

Если бы я строил массивы с нуля, я бы использовал там какой-то элемент STRUCT, но я не могу найти способ сделать это, когда массивы создаются из SPLIT()?

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Другой подход для BigQuery Standard SQL показан ниже

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 1 id, 'a|b|c' col1, 'n|o|p' col2 UNION ALL
  SELECT 2, 'd|e', 'q|r' UNION ALL
  SELECT 3, 'f|g|h|i', 's|t|u|v' UNION ALL
  SELECT 4, 'j', 'w' UNION ALL
  SELECT 5, 'k|l|m', 'x|y|z'
)
SELECT 
  id, 
  SPLIT(col1, '|')[SAFE_ORDINAL(pos)] value1, 
  SPLIT(col2, '|')[SAFE_ORDINAL(pos)] value2
FROM `project.dataset.table`,
UNNEST(GENERATE_ARRAY(1, ARRAY_LENGTH(SPLIT(col1, '|')))) pos   

с ожидаемым результатом

Row id  value1  value2   
1   1   a       n    
2   1   b       o    
3   1   c       p    
4   2   d       q    
5   2   e       r    
6   3   f       s    
7   3   g       t    
8   3   h       u    
9   3   i       v    
10  4   j       w    
11  5   k       x    
12  5   l       y    
13  5   m       z    
0 голосов
/ 09 ноября 2018

WITH_OFFSET ваш друг здесь:

WITH strings AS (
  SELECT "a,b,c" a, "aa,bb,cc" b
  UNION ALL
  SELECT "a1,b1,c1" a, "aa1,bb1,cc1" b
)

SELECT x_a, x_b
FROM strings
  , UNNEST(SPLIT(a)) x_a WITH OFFSET o_a 
  JOIN UNNEST(SPLIT(b)) x_b WITH OFFSET o_b
  ON o_a=o_b

enter image description here

...