Один из вариантов - использовать row_number()
:
select id, content, type
from (
select id, content, 'post' type, (row_number() over(order by id) - 1) / 10 rn
from posts
union all select id, content, 'ads', row_number() over(order by id) - 1
from ads
)
where rn <= 1
order by rn, type desc
Хитрость заключается в том, чтобы разделить номера строк таблицы posts
на 10, чтобы каждая группа из 10 последовательных строк получила одинаковый ранг. Затем внешний запрос сортируется по рангу, а затем по убыванию. Сначала помещаются первые 10 сообщений (с рангом 0), затем 1 объявление и т. Д. Ранг также может быть использован для ограничения количества групп.