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
这里的技术称为数据透视(将行转换为列)