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]