【问题标题】:Transposing in Standard SQL - BigQuery [duplicate]在标准 SQL 中转置 - BigQuery [重复]
【发布时间】:2018-09-05 10:45:35
【问题描述】:

我想知道如何使用 BigQuery 的标准 SQL 将行转换为列。

我已经阅读了一些关于此的帖子,但其中大多数都使用 BigQuery 的遗留函数“GROUP_CONCAT_UNQUOTED”,该函数在标准 SQL 版本中不存在。

这是我的数据结构:

这就是我想要实现的目标:

感谢您的帮助。

【问题讨论】:

  • 谷歌“透视查询 SQL”。如果键的数量是已知且固定的,那么您不需要 SQL 引擎提供任何强大的火力,只需一个数据透视查询即可。

标签: google-cloud-platform google-bigquery


【解决方案1】:

如果键的数量是已知且固定的,那么简单的数据透视查询应该可以工作:

SELECT
    id,
    MAX(CASE WHEN key = 'technician' THEN value END) AS technician,
    MAX(CASE WHEN key = 'supervisor' THEN value END) AS supervisor,
    MAX(CASE WHEN key = 'location'   THEN value END) AS location
FROM yourTable
GROUP BY id;

【讨论】:

  • 该解决方案运行良好。感谢您的帮助。
【解决方案2】:

另一种解决方案 - 不同的逻辑,不同的语法:

#standardSQL
SELECT id, 
  JSON_EXTRACT_SCALAR(value, '$.technician') technician,
  JSON_EXTRACT_SCALAR(value, '$.supervisor') supervisor,
  JSON_EXTRACT_SCALAR(value, '$.location') location
FROM (
  SELECT id, CONCAT('{', STRING_AGG(CONCAT('"', key, '":"', value, '"')), '}') value
  FROM `project.dataset.table`
  GROUP BY id
)   

我怀疑它对于这个特定问题是否有很多额外的价值(甚至根本没有),但我发现这个方向在某些情况下很有用。

【讨论】:

    【解决方案3】:

    另一种解决方案 - 相同的逻辑,只是语法不同:

    select
        id,
        MAX(if(key = 'technician', value, null)) AS technician,
        MAX(if(key = 'supervisor', value, null)) AS supervisor,
        MAX(if(key = 'location', value, null)) AS location
    from `dataset.yourTable`
    group by id
    

    【讨论】:

      猜你喜欢
      • 2018-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-29
      相关资源
      最近更新 更多