Votre question peut-elle être reformulée comme suit :
"Pour chacun des dix fournisseurs sélectionnés au hasard, trouvez une offre sélectionnée au hasard proposée par ce fournisseur" ?
Si oui, cela vous dit à peu près quoi faire. Vous avez besoin de deux couches, une passe pour sélectionner au hasard dix fournisseurs, puis une passe pour sélectionner une offre aléatoire par fournisseur.
Données factices données :
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;
En voici une qui fonctionne :
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;
... à peu près simplement en implémentant la formulation ci-dessus en tant que SQL. Je ne sais pas si c'est rapide ; vous voyez l'idée.
Si la reformulation ci-dessus n'est pas correcte, veuillez clarifier votre question avec des exemples de données et un exemple, ou plus de détails dans votre description.