sql >> Databasteknik >  >> RDS >> Mysql

Partisk slumpmässig i SQL?

Du måste generera ett slumptal per rad och vikta det.

I det här fallet, RAND(CHECKSUM(NEWID())) kommer runt "per query"-utvärderingen av RAND . Sedan multiplicera det helt enkelt med boost och BESTÄLL EFTER resultatet DESC. SUM..OVER ger dig den totala ökningen

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

Om du har väldigt olika boost-värden (som jag tror att du nämnde), skulle jag också överväga att använda LOG (som är bas e) för att jämna ut fördelningen.

Slutligen, ORDER BY NEWID() är en slumpmässighet som inte skulle ta hänsyn till boost. Det är användbart att se RAND men inte av sig självt.

Detta exempel sattes ihop på SQL Server 2008, BTW



  1. Transaktionshantering med Django 1.6

  2. Måste databasens primärnycklar vara heltal?

  3. Inre sammanfogning &yttre sammanfogning; är ordningen på tabellerna i från viktig?

  4. Hur man infogar värde i identitetskolumn manuellt i SQL Server-tabell - SQL Server / T-SQL självstudie del 41