Google cloud platform 在BigQuery中,我如何分组到结构中?

Google cloud platform 在BigQuery中,我如何分组到结构中?,google-cloud-platform,google-bigquery,Google Cloud Platform,Google Bigquery,我有以下数据: player_id level talent_id 1 1 a 1 2 b 1 3 c 2 1 d 2 2 e 并希望按玩家id分组,并将行作为结构,将级别值作为结构字段名: player_id data 1 {_1 = a, _2 = b, _3 = c} 2 {_1 = d, _2 = e, _3 = null} leve

我有以下数据:

player_id level talent_id
1         1     a
1         2     b
1         3     c
2         1     d
2         2     e
并希望按玩家id分组,并将行作为结构,将
级别
值作为结构字段名:

player_id data
1         {_1 = a, _2 = b, _3 = c}
2         {_1 = d, _2 = e, _3 = null}
level列始终来自{1,2,3}的集合,但可能缺少某些级别(null)

到目前为止,我得到的是按玩家id和附加结果数组进行的聚合:

talents as (
  select
    p.player_id,
    array_agg(struct(p.level, p.talent_id)) as talents
  from source.player_talent p
  group by player_id
),

player_id data
1         [{1, a}, {2, b}, {3, c}]
2         {{1, d}, {2, e}]

现在,我需要将此数组映射到具有固定属性名的结构
\u 1
\u 2
\u 3
,这将返回预期结果:

WITH Players AS (
  SELECT 1 AS player_id, 1 AS level, 'a' AS talent_id UNION ALL
  SELECT 1, 2, 'b' UNION ALL
  SELECT 1, 3, 'c' UNION ALL
  SELECT 2, 1, 'd' UNION ALL
  SELECT 2, 2, 'e'
)
SELECT
  player_id,
  STRUCT(
    MAX(IF(level = 1, talent_id, NULL)) AS _1,
    MAX(IF(level = 2, talent_id, NULL)) AS _2,
    MAX(IF(level = 3, talent_id, NULL)) AS _3) AS data
FROM Players
GROUP BY player_id
这里的技术称为数据透视(将行转换为列)