行ごとに乱数を生成し、重みを付ける必要があります。
この場合、RAND(CHECKSUM(NEWID()))
RAND
の「クエリごと」の評価を回避します 。次に、それをブーストで乗算し、結果のDESCで順序付けします。 SUM..OVER
トータルブーストを提供します
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
ブースト値が大きく異なる場合(あなたが言及したと思います)、分散をスムーズにするためにLOG(ベースe)を使用することも検討します。
最後に、ORDER BY NEWID()は、ブーストを考慮しないランダム性です。 RANDをシードすることは便利ですが、それ自体ではできません。
このサンプルは、SQL Server 2008、ところで
にまとめられました。