PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wählen Sie eine zufällige Zeile aus einer PostgreSQL-Tabelle mit gewichteten Zeilenwahrscheinlichkeiten aus

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]