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