Транспонирование вывода в BigQuery - PullRequest
0 голосов
/ 02 мая 2020

У меня есть следующие данные

Column0      Column1     Column2     Column3    Column4
node10        node11      node12      node13
node20        node21      node22      node23     node24
node30        node31      node32                 
node40        node41      node42      node43     node44

Некоторые строки могут иметь данные до Column3 (например, Row1), а некоторые другие могут заканчиваться на Column4 (например, Row2). Column0 всегда присутствует и равен root для соответствующих строк

мне нужно иметь вывод таким образом

Column0     temporaryColumns   finalColumns    rank
node10       node11               node13        1
node10       node12               node13        2
node20       node21               node24        1
node20       node22               node24        2
node20       node23               node24        3
node30       node31               node31        1
node40       node41               node44        1
node40       node42               node44        2
node40       node43               node44        3

1 Ответ

1 голос
/ 02 мая 2020

Ниже для BigQuery Standard SQL

#standardSQL
SELECT 
  Column0, 
  arr[ORDINAL(i)] AS temporaryColumns, 
  arr[ORDINAL(len)] AS finalColumns,
  i - 1 AS `rank`
FROM `project.dataset.table` t,
UNNEST([REGEXP_REPLACE(FORMAT('%t', t), r'\(|\)|, NULL', '')]) list,
UNNEST([STRUCT(SPLIT(list) AS arr)]),
UNNEST([ARRAY_LENGTH(arr)]) len,
UNNEST(GENERATE_ARRAY(2, len - 1)) i      

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

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 'node10' Column0, 'node11' Column1, 'node12' Column2, 'node13' Column3, NULL Column4 UNION ALL    
  SELECT 'node20', 'node21', 'node22', 'node23', 'node24' UNION ALL
  SELECT 'node30', 'node31', 'node32', NULL, NULL UNION ALL
  SELECT 'node40', 'node41', 'node42', 'node43', 'node44' 
)
SELECT 
  Column0, 
  arr[ORDINAL(i)] AS temporaryColumns, 
  arr[ORDINAL(len)] AS finalColumns,
  i - 1 AS `rank`
FROM `project.dataset.table` t,
UNNEST([REGEXP_REPLACE(FORMAT('%t', t), r'\(|\)|, NULL', '')]) list,
UNNEST([STRUCT(SPLIT(list) AS arr)]),
UNNEST([ARRAY_LENGTH(arr)]) len,
UNNEST(GENERATE_ARRAY(2, len - 1)) i    

вывод такой, как показано ниже

Row Column0 temporaryColumns    finalColumns    rank     
1   node10  node11              node13          1    
2   node10  node12              node13          2    
3   node20  node21              node24          1    
4   node20  node22              node24          2    
5   node20  node23              node24          3    
6   node30  node31              node32          1    
7   node40  node41              node44          1    
8   node40  node42              node44          2    
9   node40  node43              node44          3    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...