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;
我目前遇到一个问题,我需要找到一个组中的组数。但是,我想在线创建包含组并将较小的组连接到一个字符串中。
以下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;