Bisakah pertanyaan Anda diubah menjadi:
"Untuk masing-masing dari sepuluh penyedia yang dipilih secara acak, temukan satu kesepakatan yang dipilih secara acak yang ditawarkan oleh penyedia itu" ?
Jika demikian, itu cukup memberi tahu Anda apa yang harus dilakukan. Anda memerlukan dua lapisan, satu pass untuk memilih sepuluh penyedia secara acak, lalu satu pass untuk memilih satu kesepakatan acak per penyedia.
Data dummy yang diberikan:
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;
Ini salah satu yang berfungsi:
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;
... cukup banyak hanya dengan mengimplementasikan kalimat di atas sebagai SQL. Tidak tahu apakah itu cepat; Anda mendapatkan idenya.
Jika pengulangan kata di atas tidak benar, harap klarifikasi pertanyaan Anda dengan contoh data dan contoh, atau detail lebih lanjut dalam deskripsi Anda.