以特定格式构造数据的SQL查询

以特定格式构造数据的SQL查询,sql,hive,Sql,Hive,我有以下格式的数据 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

我有以下格式的数据

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

你能告诉我如何写一个查询来把它转换成下面的格式吗

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\u set返回一个数组。这似乎比字符串更有用,但如果您愿意,可以将其转换为字符串表示。

这是一个巨大的数据集。我上面有一个样本数据。输出数据中的列数需要是动态的,这取决于ID在特定月份的子ID数。谢谢,你好,戈登。非常感谢。我有没有办法不用收集套装就能做到这一点。我使用的配置单元版本不支持此功能。请告诉我如何在不使用collect_set的情况下获取字符串表示形式?@SawanS。Hive 0.13.0于2014年发布。你的版本很旧。在这样一个旧版本中,要做到这一点并不简单。