Ini akan berhasil:
WITH CTE AS (
SELECT random() * (SELECT SUM(percent) FROM YOUR_TABLE) R
)
SELECT *
FROM (
SELECT id, SUM(percent) OVER (ORDER BY id) S, R
FROM YOUR_TABLE CROSS JOIN CTE
) Q
WHERE S >= R
ORDER BY id
LIMIT 1;
Sub-kueri Q memberikan hasil sebagai berikut:
1 50
2 85
3 100
Kami kemudian cukup menghasilkan nomor acak dalam rentang [0, 100) dan memilih baris pertama yang berada pada atau di luar nomor itu (WHERE ayat). Kami menggunakan ekspresi tabel umum (WITH ) untuk memastikan nomor acak dihitung hanya sekali.
BTW, SELECT SUM(percent) FROM YOUR_TABLE memungkinkan Anda untuk memiliki bobot dalam percent - tidak harus berupa persentase (yakni ditambahkan hingga 100).
[Fiddle SQL]