Musisz wygenerować losową liczbę na wiersz i zważyć ją.
W tym przypadku RAND(CHECKSUM(NEWID()))
omija ocenę "na zapytanie" RAND
. Następnie pomnóż to przez doładowanie i ORDER BY wynik DESC. SUM..OVER
daje całkowity impuls
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
Jeśli masz szalenie różne wartości doładowania (o których myślę, że wspomniałeś), rozważę również użycie LOG (o podstawie e) do wygładzenia rozkładu.
Wreszcie ORDER BY NEWID() jest losowością, która nie bierze pod uwagę wzmocnienia. Przydatne jest rozsiewanie RAND, ale nie samodzielnie.
Ta próbka została utworzona na SQL Server 2008, BTW