在 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 中转置输出的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery 没有获取在 java 中设置的属性

如何在 Google BigQuery 中设置用户的查询配额

如何在 ReDash 中设置标准 SQL BigQuery

如何在 BigQuery 架构中设置 FLOAT 的精度

无法在 BigQuery 中使用 DML 语句的作业中设置目标表

如何在 BigQuery 中设置项目默认计费的最大字节数?