Anda perlu membuat angka acak per baris dan menimbangnya.
Dalam hal ini, RAND(CHECKSUM(NEWID()))
mengatasi evaluasi "per kueri" dari RAND
. Kemudian cukup kalikan dengan boost dan ORDER BY hasil DESC. SUM..OVER
memberi Anda dorongan total
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
Jika Anda memiliki nilai boost yang sangat berbeda (yang saya pikir Anda sebutkan), saya juga akan mempertimbangkan untuk menggunakan LOG (yang merupakan basis e) untuk memperlancar distribusi.
Akhirnya, ORDER BY NEWID() adalah keacakan yang tidak memperhitungkan peningkatan. Ini berguna untuk menyemai RAND tetapi tidak dengan sendirinya.
Sampel ini disatukan di SQL Server 2008, BTW