• Какая логика поднятия объявлений в топ?

    @alexalexes
    Я бы построил бы структуру таблиц так, чтобы можно было бы выполнить такой запрос (по версии 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
    Ответ написан
    Комментировать