sql >> Base de Datos >  >> RDS >> Mysql

seleccione un valor aleatorio basado en la posibilidad de probabilidad

Puedes hacer esto usando rand() y luego usando una suma acumulativa. Asumiendo que suman 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;

Notas:

  • rand() se llama una vez en una subconsulta para inicializar una variable. Múltiples llamadas a rand() no son deseables.
  • Existe una posibilidad remota de que el número aleatorio esté exactamente en el límite entre dos valores. El limit 1 elige arbitrariamente 1.
  • Esto podría hacerse más eficiente deteniendo la subconsulta cuando cumep > @r .
  • Los valores no tienen que estar en ningún orden en particular.
  • Esto se puede modificar para manejar las posibilidades en las que la suma no es igual a 1, pero esa sería otra cuestión.