我有一个如下格式的数据。
ID month subid val1 val2
1 200411 a 10 20
1 200411 b 15 25
2 200411 x 9 12
2 200411 y 15 30
2 200411 z 50 11
请你告诉我如何写一个查询,将其转换为下面的格式。
ID month subid val1_1 val1_2 val1_3 val2_1 val2_2 val3_3
1 200411 a,b 10 15 null 20 25 null
2 200411 x,y,z 9 15 50 12 30 11
如果你有问题,请告诉我。非常感谢!!
一种方法是条件聚合。
select id, month, collect_set(subid) as subids,
max(case when seqnum = 1 then val1 end) as val1_1,
max(case when seqnum = 2 then val1 end) as val1_2,
max(case when seqnum = 3 then val1 end) as val1_3,
max(case when seqnum = 1 then val2 end) as val2_1,
max(case when seqnum = 2 then val2 end) as val2_2,
max(case when seqnum = 3 then val2 end) as val2_3
from (select t.*, row_number() over (partition by id order by subid) as seqnum
from t
) t
group by id;
collect_set()
返回一个数组。 这似乎比字符串更有用,但如果你愿意的话,你可以把它转换为字符串表示。