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

Voreingenommener Zufall in SQL?

Sie müssen eine Zufallszahl pro Zeile generieren und gewichten.

In diesem Fall RAND(CHECKSUM(NEWID())) umgeht die "pro Abfrage"-Auswertung von RAND . Dann einfach mit boost multiplizieren und ORDER BY das Ergebnis DESC. Die SUM..OVER gibt dir den totalen Schub

DECLARE @sample TABLE (id int, boost int)

INSERT @sample VALUES (1, 1), (2, 2), (3, 7)

SELECT
    RAND(CHECKSUM(NEWID())) * boost  AS weighted,
    SUM(boost) OVER () AS boostcount,
    id
FROM
    @sample
GROUP BY
    id, boost
ORDER BY
    weighted DESC

Wenn Sie sehr unterschiedliche Boost-Werte haben (was Sie, glaube ich, erwähnt haben), würde ich auch in Betracht ziehen, LOG (das ist die Basis e) zu verwenden, um die Verteilung zu glätten.

Schließlich ist ORDER BY NEWID() eine Zufälligkeit, die den Boost nicht berücksichtigt. Es ist nützlich, RAND zu setzen, aber nicht allein.

Dieses Beispiel wurde auf SQL Server 2008 zusammengestellt, BTW