Devi generare un numero casuale per riga e pesarlo.
In questo caso, RAND(CHECKSUM(NEWID()))
aggira la valutazione "per query" di RAND
. Quindi moltiplicalo semplicemente per boost e ORDER BY il risultato DESC. Il SUM..OVER
ti dà la spinta totale
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
Se hai valori di boost molto diversi (che penso tu abbia menzionato), prenderei in considerazione anche l'utilizzo di LOG (che è la base e) per rendere più fluida la distribuzione.
Infine, ORDER BY NEWID() è una casualità che non tiene conto del boost. È utile seminare RAND ma non da solo.
Questo esempio è stato messo insieme su SQL Server 2008, BTW