【问题标题】:SQL Group by within another group bySQL Group by 在另一个 group by 内
【发布时间】:2016-11-19 20:15:13
【问题描述】:

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

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

----------------------------------------
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 group bys。我使用 Cloudera Impala,但其他 SQL 语言的解决方案也很受欢迎。

感谢您的帮助。

【问题讨论】:

    标签: sql impala


    【解决方案1】:

    您可以使用两次group bygroup_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;
    
    猜你喜欢
    • 2020-12-05
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多