Musíte vygenerovat náhodné číslo na řádek a zvážit ho.
V tomto případě RAND(CHECKSUM(NEWID()))
obejde vyhodnocení "na dotaz" RAND
. Pak to jednoduše vynásobte boostem a OBJEDNEJTE PODLE výsledku DESC. SUM..OVER
vám dává celkovou podporu
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
Pokud máte výrazně odlišné hodnoty zesílení (což jste myslím zmínil), zvážil bych také použití LOG (což je základ e) k vyhlazení distribuce.
Konečně, ORDER BY NEWID() je náhodnost, která nebere v úvahu posílení. Je užitečné nasévat RAND, ale ne samo o sobě.
Tato ukázka byla sestavena na SQL Server 2008, BTW