SQL Group由另一个组内的
问题描述:
我目前有一个问题,我需要找到一组内的组数。但是,我想为包含组创建联机,并在一个字符串内连接较小的组。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语言的解决方案也受到赞赏。
谢谢你的帮助。
答
您可以使用两次group by
和group_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;
参考:https://www.cloudera.com/documentation/enterprise/5-5-x/topics/impala_group_concat.html –