Kan uw vraag worden geherformuleerd als:
"Zoek voor elk van de tien willekeurig geselecteerde providers één willekeurig geselecteerde deal aangeboden door die provider" ?
Als dat zo is, zegt dat ongeveer wat je moet doen. Je hebt twee lagen nodig, één pas om willekeurig tien providers te selecteren en vervolgens één pas om één willekeurige deal per provider te selecteren.
Gegeven dummy-gegevens:
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;
Hier is er een die werkt:
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;
... vrijwel gewoon door de bovenstaande frasering als SQL te implementeren. Weet niet of het snel is; je snapt het idee.
Als de bovenstaande herformulering niet correct is, verduidelijk dan uw vraag met voorbeeldgegevens en een voorbeeld, of wat meer details in uw beschrijving.