Das sollte funktionieren:
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;
Die Unterabfrage Q
ergibt folgendes Ergebnis:
1 50
2 85
3 100
Wir generieren dann einfach eine Zufallszahl im Bereich [0, 100] und wählen die erste Zeile aus, die bei oder hinter dieser Zahl liegt (das WHERE
). Klausel). Wir verwenden allgemeine Tabellenausdrücke (WITH
), um sicherzustellen, dass die Zufallszahl nur einmal berechnet wird.
Übrigens, die SELECT SUM(percent) FROM YOUR_TABLE
erlaubt Ihnen, beliebige Gewichtungen in percent
zu haben - Es müssen nicht unbedingt Prozentzahlen sein (d. h. sich zu 100 addieren).
[SQL-Geige]