sql >> Database teknologi >  >> RDS >> Mysql

Biased random i SQL?

Du skal generere et tilfældigt tal pr. række og vægte det.

I dette tilfælde RAND(CHECKSUM(NEWID())) kommer uden om "pr. forespørgsel"-evalueringen af ​​RAND . Derefter skal du blot gange det med boost og BESTILLE EFTER resultatet DESC. SUM..OVER giver dig det totale løft

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

Hvis du har vildt forskellige boost-værdier (som jeg tror du nævnte), ville jeg også overveje at bruge LOG (som er base e) til at udjævne fordelingen.

Endelig er ORDER BY NEWID() en tilfældighed, der ikke tager højde for boost. Det er nyttigt at se RAND, men ikke af sig selv.

Denne prøve blev sat sammen på SQL Server 2008, BTW



  1. PostgreSQL midlertidige tabeller

  2. T-SQL-fejl, faldgruber og bedste praksis – pivotering og unpivotering

  3. ORACLE SDO_GEOMETRY ToString()?

  4. MySQL grupperer resultater efter tidsperioder