在 BigQuery 中转置输出
Posted
技术标签:
【中文标题】在 BigQuery 中转置输出【英文标题】:Transposing output in BigQuery 【发布时间】:2020-05-02 19:55:28 【问题描述】:我有以下数据
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 始终存在并且是相应行的根
我需要这样输出
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
【问题讨论】:
检查***.com/questions/27832170/how-to-unpivot-in-bigquery 【参考方案1】:以下是 BigQuery 标准 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
【讨论】:
你试过了吗?它对你有用吗?如果有帮助,请考虑投票。并接受以上是关于在 BigQuery 中转置输出的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Google BigQuery 中设置用户的查询配额