SQL 分组依据在另一个分组依据内

SQL Group by within another group by

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

以下table是我目前面临的情况:

----------------------------------------
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
----------------------------------------

现在我想为每个时间戳查找 table 中每个 ID 的(不同)成员数,即结果应如下所示:


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

即字符串的格式为:

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

我知道,您可以通过两个连续的分组依据来解决这个问题(即,首先是时间戳和 ID 来计算成员数量,然后是时间戳用于字符串连接)。但是,我希望有一个更智能的解决方案,因为我必须将其应用于大型数据集并且不想执行 2 个 group bys。我使用 Cloudera Impala,但其他 SQL 语言的解决方案也很受欢迎。

感谢您的帮助。

您可以使用 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;