【问题标题】:Pivot Repeated fields in BigQuery透视 BigQuery 中的重复字段
【发布时间】:2016-02-19 12:04:53
【问题描述】:

我的架构如下所示:

userid:string
timestamp:integer
params:nested/repeated field with 2 fields
  - name:string (possible values: "a", "b","c")
  - value:string

我希望我的查询返回以下内容:

userid, timestamp, a, b, c
123, 1447799796, foo, bar, xyz
233, 1447799900, bob, xxx, yyy
:
:

最简单的方法是什么?

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

    当可能的值事先已知并且手动编写 SQL 的数量不多时 - 您可以在下面使用:

    SELECT 
      userid,
      ts,
      MAX(IF(params.name = "a", params.value, NULL)) WITHIN RECORD a,
      MAX(IF(params.name = "b", params.value, NULL)) WITHIN RECORD b,
      MAX(IF(params.name = "c", params.value, NULL)) WITHIN RECORD c
    FROM yourTable 
    

    如果可能的值预先“未知”和/或从运行到运行是动态的,您可以使用下面的帮助 SQL 来生成上述类型的 SQL。

    SELECT 'select userid, ts, ' + 
       GROUP_CONCAT_UNQUOTED(
          'max(if(params.name = "' + STRING(params.name) + '", params.value, null)) 
           WITHIN RECORD as [' + STRING(params.name) + ']'
       ) 
       + ' from yourTable '
    FROM (SELECT params.name FROM yourTable GROUP BY params.name)
    

    【讨论】:

    • 谢谢 Mike,使用 SQL 标准版本的 BigQuery 怎么样?
    • @FlorentCailly - 好问题!自 2015 年 11 月以来发生了很大变化。现在强烈推荐使用 BigQuery 的标准 SQL!我很久以前就迁移到这里了 :) 除了我需要使用快照时(仅在旧版 SQL 中仍然可用)
    • 谢谢 Mike,您能否发布有关如何使用标准 SQL 执行此操作的更新?出于某种原因,当我使用上述方法然后进行汇总时,我没有得到正确的结果。如果我使用FIRST 而不是MAX,我会得到更接近的结果,但仍然不是正确的结果。这是查询:
    • 如果您可以发布新问题并附上您的具体情况 - 我将非常乐意回答:o)
    • 谢谢 Mike,我刚刚做了:stackoverflow.com/questions/45642206/…
    【解决方案2】:

    类似的东西:

    SELECT 
      userid,
      timestamp,
      FIRST(name == "a", value, NULL) WITHIN RECORD a,
      FIRST(name == "b", value, NULL) WITHIN RECORD b,
      FIRST(name == "c", value, NULL) WITHIN RECORD c,
    FROM t
    

    【讨论】:

      猜你喜欢
      • 2020-02-29
      • 2021-10-09
      • 1970-01-01
      • 2016-06-18
      • 1970-01-01
      • 2017-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多