To powinno wystarczyć:
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;
Zapytanie podrzędne Q
daje następujący wynik:
1 50
2 85
3 100
Następnie po prostu generujemy losową liczbę z zakresu [0, 100) i wybieramy pierwszy wiersz, który jest równy lub większy od tej liczby (WHERE
klauzula). Używamy wspólnego wyrażenia tabelowego (WITH
), aby liczba losowa była obliczana tylko raz.
BTW, SELECT SUM(percent) FROM YOUR_TABLE
pozwala mieć dowolne wagi w percent
- nie muszą być ściśle wartościami procentowymi (tj. dodają do 100).
[Skrzypce SQL]