Google bigquery 透视BigQuery中的重复字段

Google bigquery 透视BigQuery中的重复字段,google-bigquery,Google Bigquery,我的模式如下所示: 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,

我的模式如下所示:

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
:
:

最简单的方法是什么?

大致如下:

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

如果事先知道可能的值,并且手动编写的值不多,则可以使用以下方法:

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,使用BigQuery的SQL标准版本怎么样?@FlorentCailly-问得好!自2015年11月以来,情况发生了很大变化。现在强烈推荐BigQuery的标准SQL!我很久以前就迁移到这里了:)除了我需要使用快照(仍然只在遗留SQL中可用)的时候,谢谢Mike,你能发布一个关于如何使用标准SQL来实现这一点的更新吗?出于某种原因,当我使用上述方法并进行汇总时,我没有得到正确的结果。如果我先使用
而不是
MAX
,结果会更接近,但仍然不是正确的结果。以下是问题:如果你能发布新的问题和你的具体情况-我将非常乐意回答:o)谢谢迈克,我刚刚做了: