sql >> Database >  >> RDS >> Mysql

Bevooroordeeld willekeurig in SQL?

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



  1. Hoe krijg ik de MySQL-server werkend na een OSX Yosemite-upgrade?

  2. Verzamelingen manipuleren

  3. hulp bij query over relatietabel

  4. MySQLi Query-retourwaarde in het geval van Select zonder overeenkomende rijen