时间:2016-11-19 12:09:13

标签: sql impala

我目前遇到一个问题,我需要在组中查找组的数量。但是,我想为包含组创建在线,并在字符串中连接较小的组。

下表显示了我目前面临的情况:

----------------------------------------
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语言的解决方案也很受欢迎。

感谢您的帮助。

1 个答案:

答案 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;