Dit zou moeten werken:
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;
De subquery Q
geeft het volgende resultaat:
1 50
2 85
3 100
We genereren dan eenvoudig een willekeurig getal in het bereik [0, 100) en kiezen de eerste rij die op of buiten dat getal ligt (de WHERE
clausule). We gebruiken gemeenschappelijke tabeluitdrukkingen (WITH
) om ervoor te zorgen dat het willekeurige getal slechts één keer wordt berekend.
BTW, de SELECT SUM(percent) FROM YOUR_TABLE
stelt u in staat om gewichten in percent
te gebruiken - het hoeven niet strikt percentages te zijn (d.w.z. opgeteld tot 100).
[SQL Fiddle]