我有一个表 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 表就需要花费很长时间。 是否有更好的解决方案来指示数据库引擎首先为每个组选择部分行,而不需要完全遍历?
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;