Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Aleatória tendenciosa em SQL?


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