Выбор лимитированного количества строк с группировкой
Есть таблица A (id, name) и B (id, name, a_id). Как выбрать из таблицы B набор строк состоящий из последних максимум 100 строк каждого a_id. Например: A с 3 строками id = 1,2,3 и B с 150 строками где a_id = 1, 50 строками где a_id = 2, 100 строками где a_id = 3 тогда нужно вернуть набор состоящий с 100 строк где a_id = 3, 50 строк где a_id = 2 и 100 последних строк где a_id = 1 (последние строки имею ввиду сортируя по id - DESC LIMIT)
Ответы (1 шт):
Автор решения: Roman Konoval
→ Ссылка
Как вариант можно использовать оконную функцию для получения порядкового номера ассоциированной записи, чтоб потом отфильтровать:
select * from (
select a.*, b.*, row_number() over(partition by a_id order by b.id desc) bnum
from a
inner join b on a.id = b.a_id
) as r
where r.bnum <= 100;
Второй способ это использовать LATERAL объединение:
select a.*, b.*
from a
inner join lateral (
select *
from b
where b.a_id = a.id
order by id desc
limit 100
) as b on true;