Агрегат с лимитом в postgres - PullRequest
0 голосов
/ 22 апреля 2020

В этом запросе с каждой строкой таблицы a могут быть связаны сотни строк таблицы b. Таким образом, array_agg содержит все эти значения. Я хотел бы иметь возможность установить предел для него, но привить array_agg Я могу сделать order by, но нет никакого способа установить предел.

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

Я мог бы использовать «ломтик» синтаксис в массиве, но это довольно дорого, так как сначала нужно получить все строки, а затем отбросить остальные. Какой правильный эффективный способ сделать это?

Ответы [ 2 ]

1 голос
/ 22 апреля 2020

Я бы использовал боковое соединение.

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). Я не знаю, что менее запутанно.

1 голос
/ 22 апреля 2020

Я думаю, вам нужно сначала сосчитать, а затем агрегировать:

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
...