Mysql
 sql >> Database >  >> RDS >> Mysql

Casuale parziale in SQL?

Devi generare un numero casuale per riga e pesarlo.

In questo caso, RAND(CHECKSUM(NEWID())) aggira la valutazione "per query" di RAND . Quindi moltiplicalo semplicemente per boost e ORDER BY il risultato DESC. Il SUM..OVER ti dà la spinta totale

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 hai valori di boost molto diversi (che penso tu abbia menzionato), prenderei in considerazione anche l'utilizzo di LOG (che è la base e) per rendere più fluida la distribuzione.

Infine, ORDER BY NEWID() è una casualità che non tiene conto del boost. È utile seminare RAND ma non da solo.

Questo esempio è stato messo insieme su SQL Server 2008, BTW