Mysql
 sql >> Base de données >  >> RDS >> Mysql

Aléatoire biaisé en SQL?

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