sql >> Databasteknik >  >> RDS >> Mysql

välj ett slumpmässigt värde baserat på sannolikhetschans

Du kan göra detta genom att använda rand() och sedan använda en kumulativ summa. Förutsatt att de summerar till 100 %:

select t.*
from (select t.*, (@cumep := @cumep + chance) as cumep
      from t cross join
           (select @cumep := 0, @r := rand()) params
     ) t
where @r between cumep - chance and cumep
limit 1;

Anmärkningar:

  • rand() anropas en gång i en underfråga för att initiera en variabel. Flera anrop till rand() är inte önskvärda.
  • Det finns en liten chans att slumptalet ligger exakt på gränsen mellan två värden. limit 1 väljer godtyckligt 1.
  • Detta kan göras mer effektivt genom att stoppa underfrågan när cumep > @r .
  • Värdena behöver inte vara i någon speciell ordning.
  • Detta kan modifieras för att hantera chanser där summan inte är lika med 1, men det skulle vara en annan fråga.



  1. Få [archiver] ostödd version (1.13) i filhuvudet när du kör pg_restore

  2. Ändra stora MySQL InnoDB-tabeller

  3. MySQL Workbench Tutorial – En omfattande guide till RDBMS-verktyget

  4. Skillnaden mellan multi-statement tabell-värderade funktioner och inline tabell-värderade funktioner i SQL Server