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

vyberte náhodnou hodnotu na základě pravděpodobnosti šance

Můžete to udělat pomocí rand() a poté pomocí kumulativního součtu. Za předpokladu, že jejich součet dosáhne 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;

Poznámky:

  • rand() je volána jednou v poddotazu k inicializaci proměnné. Vícenásobná volání rand() nejsou žádoucí.
  • Existuje malá pravděpodobnost, že náhodné číslo bude přesně na hranici mezi dvěma hodnotami. limit 1 libovolně zvolí 1.
  • To by se dalo zefektivnit zastavením dílčího dotazu při cumep > @r .
  • Hodnoty nemusí být v žádném konkrétním pořadí.
  • To lze upravit tak, aby zpracovávalo šance, kde součet není roven 1, ale to by byla jiná otázka.



  1. Jak změnit text na malá písmena v SQL

  2. Funkce LEAST() v PostgreSQL

  3. Jak zobrazit velikost schématu Oracle pomocí dotazu SQL?

  4. Zálohování na úrovni tabulky