Вы можете использовать оконные функции:
select *
from (
select
t.*,
row_number() over(partition by a order by random()) rn
from mytable t
) t
where rn = 1
row_number()
назначает случайный ранг каждой записи в группах, имеющих одинаковые a
; затем внешний запрос фильтрует одну запись на группу.
На самом деле, поскольку вы запускаете Postgres, вы также можете использовать distinct on
, что может повысить производительность (и сократить синтаксис):
select distinct on (a) t.*
from mytable t
order by a, random();