postgresql 以postgres为单位限制的聚合

6psbrbz9  于 2022-11-29  发布在  PostgreSQL
关注(0)|答案(3)|浏览(147)

在这个查询中,表a的每一行都可能与表b的数百行相关联。因此,array_agg包含所有这些值。我希望能够为它设置一个限制,但我可以设置array_agg,但没有办法设置限制。

select a.column1, array_agg(b.column2)
from a left join b using (id)
where a.column3 = 'value'
group by a.column1

我可以在数组上使用“slice”语法,但这是相当昂贵的,因为它首先必须检索所有行,然后丢弃其他行。

f0brbegy

f0brbegy1#

我会使用横向接合。

select a.column1, array_agg(b.column2)
from a left join lateral 
    (select id, column2 from b where b.id=a.id order by something limit 10) b using (id)
where a.column3 = 'value'
group by a.column1

因为“id”限制已经在横向查询中,所以可以使用连接条件on true而不是using (id),我不知道哪个比较容易混淆。

uidvcgyl

uidvcgyl2#

我认为您需要先计数,然后再汇总:

select a.column1, array_agg(b.column2)
from (select a.column1, b.column2,
             row_number() over (partition by a.column1 order by a.column1) as seqnum
      from a left join
           b 
           using (id)
      where a.column3 = 'value'
     ) a
where seqnum <= 10
group by a.column1
np8igboo

np8igboo3#

select a.column1, (array_agg(b.column2 order by 
-- <some stable metric for immutable dataset in each query>
))[1:10]
from a left join b using (id)
where a.column3 = 'value'
group by a.column1

相关问题