Ниже для 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