雅典娜上的复杂 SQL 查询聚合和分组

Complex SQL query aggregation and grouping on athena

我有一个 table 这样的:

|     db      |      chat_id      |   Admin    |     user      |
+-------------+-------------------+------------+---------------+
|    db_1     |      chat_id1     |    max     |     greg      |
|    db_1     |      chat_id2     |    max     |     bob       |
|    db_1     |      chat_id3     |    max     |     greg      |
|    db_1     |      chat_id2     |    helen   |     greg      |
|    db_2     |      chat_id1     |    alan    |     greg      |

我想检索用户为每个数据库执行的聊天次数 和我失败的最后一部分,还检索 用户的所有导师列表

例如最终输出应该是这样的(注意在管理栏中 greg 最多只有一次)

|     db      |      user     |  nb_of_chat  |     admins    |
+-------------+---------------+--------------+---------------+
|    db_1     |      greg     |      3       |   max, helen  |
|    db_1     |      bob      |      1       |      max      |
|    db_2     |      greg     |      1       |      alan     |

我写了以下查询,但它没有聚合管理员,我已经分开 nb_of chats/mentors。

SELECT db, user, COUNT(chat_id), admins
FROM "chat_db"."chats" 
GROUP BY db, user, admins;

正如预期的那样,我得到了以下结果(但我只希望它在一行中由 db/user 和同一列中的分组管理员组成):

|     db      |      user     |  nb_of_chat  |     admins    |
+-------------+---------------+--------------+---------------+
|    db_1     |      greg     |      2       |       max     |
|    db_1     |      greg     |      1       |      helen    |
|    ...      |      ...      |     ...      |      ...      |

你知道如何执行它吗?

感谢您的宝贵时间!

此致。

尝试使用 array_agg():

select db, user, count(chat_id), array_agg(admins)
from  "chat_db"."chats" 
group by db, user;

如果你想要每个 db 一行:

select db, count(*) as num_chats, count(distinct user) as num_users, array_agg(admins)
from  "chat_db"."chats" 
group by db;

首先,从 group by 子句中删除 admins,因为您要对其进行聚合。然后,在 Presto 中,您可以按如下方式进行字符串聚合:

select db,user, count(*) no_of_chats, 
    array_join(array_agg(admins), ', ') all_admins
from  "chat_db"."chats" 
group by db, user;

如果需要,您可以向 array_agg() 添加 order by 子句:

select db,user, count(*) no_of_chats, 
    array_join(array_agg(admins order by admins), ', ') all_admins
from  "chat_db"."chats" 
group by db, user;

请注意,我将 count(chat_id) 更改为 count(*):两者是等效的(因为 chat_id 可能是非 null 列),前者是 ( sligthly) 更有效,并且在我看来使意图更清晰。