2016-11-19 42 views
2

我目前有一个问题,我需要找到一组内的组数。但是,我想为包含组创建联机,并在一个字符串内连接较小的组。SQL Group由另一个组内的

下表显示了我目前所面临的形势:

---------------------------------------- 
Timestamp   ID    Member 
---------------------------------------- 
1     1    A 
1     1    B 
1     2    A 
1     2    B 
1     2    C 
2     1    A 
2     2    A 
2     2    A 
2     2    C 
---------------------------------------- 

现在我要找到每个时间戳,每个ID的许多(不同)的成员是如何在表中,即,结果应是这样的:


Timestamp   MemberIDCount 
---------------------------------------- 
1     1:2,2:3 
2     1:1,2:2 
---------------------------------------- 

即字符串的格式是:

[ID]:[count(distinct(member)],... 

我知道,你可以用两个连续的group bys来解决这个问题(也就是说,首先在时间戳和ID上计数成员,在字符串连接上打开时间戳)。但是,我希望有一个更智能的解决方案,因为我必须将它应用于大型数据集,并且不希望执行2组bys。我与Cloudera Impala一起工作,但其他SQL语言的解决方案也受到赞赏。

谢谢你的帮助。

回答

2

您可以使用两次group bygroup_concat()。我没有黑斑羚在手,但这样的事情应该工作:

select timestamp, 
     group_concat(concat_ws(':', member, cnt)) 
from (select timestamp, member, count(*) as cnt 
     from t 
     group by timestamp, member 
    ) tm 
group by timestamp 
order by timestamp; 
+0

参考:https://www.cloudera.com/documentation/enterprise/5-5-x/topics/impala_group_concat.html –