Může být vaše otázka přeformulována jako:
"Najděte pro každého z deseti náhodně vybraných poskytovatelů jednu náhodně vybranou nabídku nabízenou tímto poskytovatelem" ?
Pokud ano, v podstatě vám to říká, co máte dělat. Potřebujete dvě vrstvy, jeden průchod pro náhodný výběr deseti poskytovatelů, potom jeden průchod pro výběr jedné náhodné nabídky na poskytovatele.
Daná fiktivní data:
create table spam ( deal text, provider text );
insert into spam(deal,provider)
SELECT prov_id||n::text, prov_id FROM (
SELECT chr(x) AS prov_id from generate_series(97, 92+26) x) y
CROSS JOIN generate_series(1,10) n;
select provider FROM spam GROUP BY provider ORDER BY random() LIMIT 10;
Zde je jeden, který funguje:
SELECT
(SELECT deal FROM spam WHERE spam.provider = sel_prov.provider ORDER BY random() LIMIT 1),
sel_prov.provider
FROM (select provider FROM spam GROUP BY provider ORDER BY random() LIMIT 10) sel_prov;
... v podstatě jen implementací výše uvedeného frázování jako SQL. Nevím, jestli je to rychlé; máte nápad.
Pokud výše uvedené přeformulování není správné, objasněte prosím svou otázku ukázkovými údaji a příkladem nebo podrobněji v popisu.