Du måste generera ett slumptal per rad och vikta det.
I det här fallet, RAND(CHECKSUM(NEWID()))
kommer runt "per query"-utvärderingen av RAND
. Sedan multiplicera det helt enkelt med boost och BESTÄLL EFTER resultatet DESC. SUM..OVER
ger dig den totala ökningen
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
Om du har väldigt olika boost-värden (som jag tror att du nämnde), skulle jag också överväga att använda LOG (som är bas e) för att jämna ut fördelningen.
Slutligen, ORDER BY NEWID() är en slumpmässighet som inte skulle ta hänsyn till boost. Det är användbart att se RAND men inte av sig självt.
Detta exempel sattes ihop på SQL Server 2008, BTW