Debe generar un número aleatorio por fila y ponderarlo.
En este caso, RAND(CHECKSUM(NEWID()))
sortea la evaluación "por consulta" de RAND
. Luego simplemente multiplícalo por boost y ORDENA POR el resultado DESC. El SUM..OVER
te da el 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
Si tiene valores de impulso muy diferentes (que creo que mencionó), también consideraría usar LOG (que es la base e) para suavizar la distribución.
Finalmente, ORDER BY NEWID() es una aleatoriedad que no tendría en cuenta el impulso. Es útil para sembrar RAND pero no por sí mismo.
Esta muestra se armó en SQL Server 2008, por cierto