Você precisa gerar um número aleatório por linha e ponderá-lo.
Neste caso,
RAND(CHECKSUM(NEWID()))
contorna a avaliação "por consulta" de RAND
. Em seguida, basta multiplicá-lo por boost e ORDER BY o resultado DESC. O SUM..OVER
dá-lhe o impulso 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
Se você tiver valores de aumento muito diferentes (que acho que você mencionou), também consideraria usar LOG (que é a base e) para suavizar a distribuição.
Finalmente, ORDER BY NEWID() é uma aleatoriedade que não levaria em conta o aumento. É útil semear RAND, mas não por si só.
Esta amostra foi montada no SQL Server 2008, BTW