Вы можете использовать оконную функцию PERCENT_RANK
SELECT *
FROM
(
select *, PERCENT_RANK() OVER (PARTITION BY columnname ORDER BY random()) AS pcrnk
from tablename
where columnname = 'A'
) q
WHERE pcrnk <= 0.05
А если вы не хотите видеть этот pcrnk в результате?
SELECT (t).*
FROM
(
select t, PERCENT_RANK() OVER (PARTITION BY columnname ORDER BY random()) AS pcrnk
from tablename t
where columnname = 'A'
) q
WHERE pcrnk <= 0.05
Тест по дБ <> скрипка здесь
Эти запросы будут извлекать 5% от того, что обычно получается на основе критериев columnname = 'A'
F.E. если есть 100 'A' и 1000 'B', то они возвращают 5 записей.
Если вы хотите вернуть 5% всех записей в таблице? Тогда вот еще один трюк.
select *
from tablename
where columnname = 'A'
order by random()
limit 0.05 * (select count(*) from tablename)