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

Come selezionare una riga in modo casuale tenendo conto di un peso?

Penso che il più semplice sia in realtà utilizzare il campionamento ponderato del serbatoio:

SELECT
  id,
  -LOG(RAND()) / weight AS priority
FROM
  your_table
ORDER BY priority
LIMIT 1;

È un ottimo metodo che ti consente di scegliere M su N elementi in cui la probabilità di essere scelta per ciascun elemento è proporzionale al suo peso. Funziona altrettanto bene quando ti capita di volere un solo elemento. Il metodo è descritto in questo articolo . Nota che scelgono i valori più grandi di POW(RAND(), 1/peso), che equivale a scegliere i valori più piccoli di -LOG(RAND())/peso.