sql >> Base de Datos >  >> RDS >> Mysql

¿Sesgado al azar en SQL?

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