Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie wähle ich eine Zeile zufällig unter Berücksichtigung eines Gewichts aus?

Ich denke, am einfachsten ist es tatsächlich, die gewichtete Reservoir-Probenahme zu verwenden:

SELECT
  id,
  -LOG(RAND()) / weight AS priority
FROM
  your_table
ORDER BY priority
LIMIT 1;

Es ist eine großartige Methode, mit der Sie M aus N Elementen auswählen können, wobei die Wahrscheinlichkeit, für jedes Element ausgewählt zu werden, proportional zu seinem Gewicht ist. Es funktioniert genauso gut, wenn man zufällig nur ein Element haben möchte. Die Methode ist beschrieben in diesen Artikel . Beachten Sie, dass sie die größten Werte von POW(RAND(), 1/weight) auswählen, was der Auswahl der kleinsten Werte von -LOG(RAND()) / weight entspricht.