Я бы построил бы структуру таблиц так, чтобы можно было бы выполнить такой запрос (по версии sql Oracle):
-- премиум выборка
select 1 as priv_type, -- тип привилегии 1 - премиум объявление
C.*
from
(
select B.*,
dense_runk() over (order by B.user_id) as user_num, -- нумеруем авторов объявлений
row_number() over (partition by B.user_id order by rownum) as add_num -- нумеруем объявление в пределах автора
from
( -- достаем премиум объявления в случайной сортировке
select A.*
from A
where premium_pay_date is not null and sysdate - premium_pay_date <= 3 -- условие попадания в премиум
order by DBMS_RANDOM.RANDOM
) B
) C
where user_num <= 5 -- берем 5 авторов
and add_num = 1 -- по одному объявлению от автора
union
-- обычная выборка
select 2 as priv_type, -- тип привилегии 2 - обычное объявление
A.*,
-- зануляем доп. поля от премиум, чтобы union работал корректно
null user_num,
null add_num
from A
where premium_pay_date is null or sysdate - premium_pay_date > 3 -- можно исключить премиум из общей выборки, а можно не исключать
order by priv_type, Publication_Date desc