Mysql
 sql >> Baza danych >  >> RDS >> Mysql

wybierz losową wartość na podstawie prawdopodobieństwa szansy

Możesz to zrobić za pomocą rand() a następnie za pomocą sumy skumulowanej. Zakładając, że sumują się do 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;

Uwagi:

  • rand() jest wywoływana raz w podzapytaniu, aby zainicjować zmienną. Wiele wywołań rand() nie są pożądane.
  • Istnieje niewielka szansa, że ​​liczba losowa będzie dokładnie na granicy dwóch wartości. limit 1 arbitralnie wybiera 1.
  • Mogłoby to być bardziej wydajne przez zatrzymanie podzapytania, gdy cumep > @r .
  • Wartości nie muszą być w określonej kolejności.
  • Można to zmodyfikować, aby poradzić sobie z szansami, w których suma nie jest równa 1, ale to byłoby inne pytanie.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Przywróć folder bazy danych MySQL z odzyskanego dysku twardego

  2. SQL Zastąp wiele zmiennych z innej tabeli w wyniku zapytania

  3. docker-compose:ponowna inicjalizacja bazy danych MySQL za każdym razem

  4. ORDER BY NULL w MySQL

  5. Używanie JQuery do wstawiania wartości do mySQL