¿Se puede reformular su pregunta como:
"Para cada uno de los diez proveedores seleccionados al azar, encuentre una oferta seleccionada al azar ofrecida por ese proveedor" ?
Si es así, eso prácticamente te dice qué hacer. Necesita dos capas, una pasada para seleccionar al azar diez proveedores, luego una pasada para seleccionar una oferta aleatoria por proveedor.
Dados datos ficticios:
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;
Aquí hay uno que funciona:
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;
... más o menos simplemente implementando la redacción anterior como SQL. No sé si es rápido; entiendes la idea.
Si la reformulación anterior no es correcta, aclare su pregunta con datos de muestra y un ejemplo, o algún detalle más en su descripción.