Можете ли вы попробовать это и посмотреть, работает ли это? Что я делаю, так это сначала ранжирую данные id1, чтобы ранг равнялся 1,2 для дублированных значений Id1. Затем используйте ранг и объедините с 'event_', чтобы сформировать что-то вроде 'event_1', 'event_2' и т. Д.
Есть 2 варианта ниже. 1) использует named_struct 2) использует to_map Я не пробовал этого, поэтому может быть некоторая проблема с синтаксисом, но надеюсь, что вы поняли.
with data as (
select
id1, id2, event,
row_number() over (partition by id1 order by id1) as rnk
from table
),
collect_data as (
select id1, id2, collect_set(named_struct(concat("event_', rnk), event)) kv
from data
group by id1,id2
)
select id1, id2, kv[0]['event_1'], kv[0]['event_2']...
from collect_data;
ИЛИ
with data as (
select
id1, id2, event,
row_number() over (partition by id1 order by id1) as rnk
from table
),
collect_data as (
select id1, id2, to_map(concat('event_',rnk), event) as kv
from data
group by id1, id2
)
select id1, id2,
kv['c1'] AS c1,
kv['c2'] AS c2,
kv['c3'] AS c3
from collect_data;