sql >> Databáze >  >> RDS >> Mysql

Zkreslená náhoda v SQL?

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



  1. Čárky v datech CSV

  2. cross-dbms způsob, jak zkontrolovat, zda je řetězec číselný

  3. Selhalo stavební kolo pro psycopg2 - MacOSX pomocí virtualenv a pip

  4. Jak získám názvy sloupců v Laravel 4?