Вы можете использовать оконные функции с объединением
select v.value, v.cnt
from (select value, count(*) as cnt,
row_number() over (order by count(*) desc) as seqnum_desc,
row_number() over (order by count(*) asc) as seqnum_asc
from t
group by value
) v
where seqnum_desc <= 2 or seqnum_asc <= 2;
Примечание: В случае связей - особенно вероятно, в нижней части - это возвращает произвольные значения с одинаковым количеством. Вы можете настроить это с помощью rank()
или dense_rank()
, в зависимости от того, что вы хотите в этом случае.