Kann Ihre Frage wie folgt umformuliert werden:
"Für jeden von zehn zufällig ausgewählten Anbietern ein zufällig ausgewähltes Angebot dieses Anbieters finden" ?
Wenn ja, sagt Ihnen das ziemlich genau, was zu tun ist. Sie benötigen zwei Ebenen, einen Durchgang zur zufälligen Auswahl von zehn Anbietern und einen Durchgang zur Auswahl eines zufälligen Deals pro Anbieter.
Gegebene Dummy-Daten:
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 ist eine, die funktioniert:
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;
... so ziemlich nur durch die Implementierung der obigen Formulierung als SQL. Weiß nicht, ob es schnell ist; du verstehst schon.
Wenn die obige Umformulierung nicht korrekt ist, verdeutlichen Sie Ihre Frage bitte mit Beispieldaten und einem Beispiel oder etwas detaillierter in Ihrer Beschreibung.