Vous devez générer un nombre aléatoire par ligne et le pondérer.
Dans ce cas, RAND(CHECKSUM(NEWID()))
contourne l'évaluation "par requête" de RAND
. Ensuite, multipliez-le simplement par boost et ORDER BY le résultat DESC. Le SUM..OVER
vous donne le coup de pouce 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 vous avez des valeurs de boost très différentes (ce que je pense que vous avez mentionné), j'envisagerais également d'utiliser LOG (qui est en base e) pour lisser la distribution.
Enfin, ORDER BY NEWID() est un caractère aléatoire qui ne tiendrait pas compte du boost. Il est utile d'ensemencer RAND mais pas par lui-même.
Cet exemple a été assemblé sur SQL Server 2008, BTW