Gewichtetes Zufallsergebnis aus einer SQLite-Tabelle

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;

 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert