Je moet een willekeurig getal per rij genereren en het wegen.
In dit geval RAND(CHECKSUM(NEWID()))
omzeilt de "per query" evaluatie van RAND
. Vermenigvuldig het dan gewoon met boost en BESTEL DOOR het resultaat DESC. De SUM..OVER
geeft je de totale boost
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
Als je enorm verschillende boost-waarden hebt (waarvan ik denk dat je die hebt genoemd), zou ik ook overwegen om LOG (dat is basis e) te gebruiken om de distributie te vergemakkelijken.
Ten slotte is ORDER BY NEWID() een willekeur die geen rekening houdt met boost. Het is handig om RAND te seeden, maar niet op zichzelf.
Dit voorbeeld is samengesteld op SQL Server 2008, BTW