我目前遇到一个问题,我需要在组中查找组的数量。但是,我想为包含组创建在线,并在字符串中连接较小的组。
下表显示了我目前面临的情况:
----------------------------------------
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)],...
我知道,你可以用两个连续的分组来解决这个问题(即,首先在时间戳和ID上计算成员和字符串连接的开启时间戳)。但是,我希望有一个更智能的解决方案,因为我必须将其应用于大型数据集,并且不希望必须执行2个分组。我使用Cloudera Impala,但其他SQL语言的解决方案也很受欢迎。
感谢您的帮助。
答案 0 :(得分:2)
您可以使用group by
两次和group_concat()
来执行此操作。我手边没有Impala,但是这样的事情应该有效:
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;