雅典娜上的复杂 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) 更有效,并且在我看来使意图更清晰。
我有一个 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) 更有效,并且在我看来使意图更清晰。