Трябва да генерирате произволно число на ред и да го претеглите.
В този случай 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, BTW