Выбор лимитированного количества строк с группировкой

Есть таблица 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;
→ Ссылка