Pom*_*oma 3 google-bigquery google-cloud-platform
我有以下数据:
player_id level talent_id
1 1 a
1 2 b
1 3 c
2 1 d
2 2 e
Run Code Online (Sandbox Code Playgroud)
并希望按player_id分组并将行作为结构,将level值作为结构字段名称:
player_id data
1 {_1 = a, _2 = b, _3 = c}
2 {_1 = d, _2 = e, _3 = null}
Run Code Online (Sandbox Code Playgroud)
级别列始终来自 {1, 2, 3} 集合,但某些级别可能会丢失(空)
到目前为止,我得到的是按player_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}]
Run Code Online (Sandbox Code Playgroud)
现在我需要将此数组映射到具有固定属性名称的结构_1,,_2_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
Run Code Online (Sandbox Code Playgroud)
这里的技术称为旋转(将行转换为列)。
| 归档时间: |
|
| 查看次数: |
3555 次 |
| 最近记录: |