如何在PG的一条查询语句中只聚合每一组的部分成员?

问题描述 投票:0回答:1

我有一个表 people(gid int, name varchar),其中包含数据:

gid    name                 
1      Bill
2      Will
2      Musk
2      Jack
1      Martin
1      Jorge

现在我想要得到如下结果集:

  gid   representative(varchar)
   1     Bill, Martin
   2     Will, Musk

我的意思是列出每个组,并以该组中的两个人的名字作为代表。这里顺序并不重要,计数很重要。如何在一个查询语句中(即在 PG 中)完成此操作?

经过长时间的多次尝试,我可以通过这句话达到目的:

with indexed as(
    select id,name,row_number() over (partition by id) as index
    from people
),filtered as(
    select id, name 
    from indexed where index<3
)
select id,string_agg(name,',')
from filtered
group by id;

然而,实际的表有大量的行和更复杂的模式。由于遍历整个表,仅创建第一个“索引”CTE 表就需要花费很长时间。 是否有更好的解决方案来指示数据库引擎首先为每个组选择部分行,而不需要完全遍历?

sql postgresql aggregate partial group
1个回答
0
投票
with indexed as(
    select id,name,row_number() over (partition by id) as index
    from people
),filtered as(
    select id, name 
    from indexed where index<3
)
select id,string_agg(name,',')
from filtered
group by id;
© www.soinside.com 2019 - 2024. All rights reserved.