Heim >Datenbank >MySQL-Tutorial >Wie kann ich mit SQL zufällig eine Zeile aus einer gewichteten Tabelle auswählen?

Wie kann ich mit SQL zufällig eine Zeile aus einer gewichteten Tabelle auswählen?

Linda Hamilton
Linda HamiltonOriginal
2024-12-23 06:34:47683Durchsuche

How Can I Randomly Select a Row from a Weighted Table with SQL?

Zufällige Zeilenauswahl mit gewichteter Wahrscheinlichkeit

Stellen Sie sich eine Tabelle mit Feldern wie ID, Inhalt und Gewicht vor. Ihr Ziel ist es, zufällig eine einzelne Zeile aus dieser Tabelle auszuwählen und dabei die Gewichtungen zu berücksichtigen.

Zum Beispiel drei Zeilen mit den folgenden Daten:

id, content, weight
1, "some content", 60
2, "other content", 40
3, "something", 100

Die Wahrscheinlichkeitsverteilung ist wie folgt :

  • Zeile 1: 30 %
  • Zeile 2: 20 %
  • Zeile 3: 50 %

Gewichtete Reservoirprobenahme

Der einfachste Ansatz, dies zu erreichen, ist die gewichtete Reservoirprobenahme:

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

Diese Methode garantiert eine sinnvolle Auswahl von M Elementen aus einer Sammlung von N Elementen, wobei die Wahrscheinlichkeit Die Auswahl jedes Elements ist proportional zu seinem Gewicht. Es bleibt auch dann wirksam, wenn nur ein einzelnes Element gewünscht wird.

Das Grundprinzip der gewichteten Reservoirprobenahme wird im bereitgestellten Artikel ausführlich beschrieben. Insbesondere geht es darum, die kleinsten Werte von -LOG(RAND())/Gewicht auszuwählen und nicht die größten Werte von POW(RAND(), 1/Gewicht), wie im Artikel dargestellt. Dies führt zu gleichwertigen Ergebnissen.

Das obige ist der detaillierte Inhalt vonWie kann ich mit SQL zufällig eine Zeile aus einer gewichteten Tabelle auswählen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn