Detta borde göra susen:
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;
Underfrågan Q
ger följande resultat:
1 50
2 85
3 100
Vi genererar sedan helt enkelt ett slumpmässigt tal i intervallet [0, 100) och väljer den första raden som är vid eller bortom det numret (WITH
) för att säkerställa att slumptalet endast beräknas en gång.
BTW, VÄLJ SUMMA(procent) FRÅN DIN_TABELL
låter dig ha valfri vikt i procent
- de behöver strikt inte vara procentsatser (d.v.s. lägga till 100).
[SQL-fiol]