Du skal generere et tilfældigt tal pr. række og vægte det.
I dette tilfælde RAND(CHECKSUM(NEWID()))
kommer uden om "pr. forespørgsel"-evalueringen af RAND
. Derefter skal du blot gange det med boost og BESTILLE EFTER resultatet DESC. SUM..OVER
giver dig det totale løft
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
Hvis du har vildt forskellige boost-værdier (som jeg tror du nævnte), ville jeg også overveje at bruge LOG (som er base e) til at udjævne fordelingen.
Endelig er ORDER BY NEWID() en tilfældighed, der ikke tager højde for boost. Det er nyttigt at se RAND, men ikke af sig selv.
Denne prøve blev sat sammen på SQL Server 2008, BTW