Aus einer SQLite-Tabelle soll mit einem einfachen SELECT-Query ein gewichtetes Zufallsergebnis, also eine zufällig ausgewählte Zeile selektiert werden. Die in der Tabelle vorhandenen Zeilen sollen aber nicht mit der gleichen Wahrscheinlichkeit auftreten, sondern nach einem zeilenspezifischen Integer-Wert gewichtet werden.
In der Tabelle Event liegen folgende Spalten vor:
id | bezeichnung | gewichtung
Eine Zeile mit gewichtung = 2 soll also doppelt so häufig selektiert werden wie eine Zeile mit gewichtung = 1.
Eine (pseudo-)zufällig ausgewählte, dabei aber nach gewichtung gewichtete Zeile erhält man nun, unter Zuhilfenahme der kumulierten Gewichtung, durch folgende Abfrage:
SELECT t.id, t.bezeichnung, t.gewichtung FROM Event t INNER JOIN ( SELECT t.id, SUM(tt.gewichtung) AS cum_weight FROM Event t INNER JOIN Event tt ON tt.id <= t.id GROUP BY t.id ) tc ON tc.id = t.id ,( SELECT ABS(RANDOM() % SUM(gewichtung)) AS rnd FROM Event) WHERE rnd >= (cum_weight - gewichtung) AND rnd < cum_weight ORDER BY t.id ASC;