Teniendo en cuenta la instrucción SQL anterior, cualquier número que tiene en cur_odds
son no las probabilidades de que se selecciona cada fila, sino que es sólo una ponderación arbitraria (en relación a los "pesos" de todas las otras filas) que podrían en su lugar, se interpretará mejor como una tendencia relativa a flotar hacia la parte superior de la tabla ordenada. El valor real en cada fila no tiene sentido (por ejemplo, podría tener 4 filas con valores de 0.35, 0.5, 0.75 y 0.99, o podría tener valores de 35, 50, 75 y 99, y los resultados serían los mismos).
Actualización: Esto es lo que está sucediendo con su consulta. Tiene una fila con un valor cur_odds
de 0,35. Por el bien de la ilustración, voy a suponer que las otras 9 filas tienen el mismo valor (0.072). También para ilustrar, supongamos que RAND() devuelve un valor de 0.0 a 1.0 (en realidad puede).
Cada vez que ejecuta esta instrucción SELECT, a cada fila se le asigna un valor de clasificación multiplicando su valor cur_odds
por un valor RAND() de 0.0 a 1.0. Esto significa que la fila con un 0.35 tendrá un valor de clasificación entre 0.0 y 0.35.
Cada dos filas (con un valor de 0.072) tendrá valores de clasificación que oscilan entre 0.0 y 0.072. Esto significa que hay aproximadamente un 80% de posibilidades de que su fila tenga un valor de clasificación mayor que 0.072, lo que significa que hay sin posibilidad de de que cualquier otra fila se pueda clasificar más arriba. Esta es la razón por la cual su fila con el valor cur_odds
de 0.35 está subiendo primero más de lo esperado.
Describí incorrectamente el valor cur_odds
como una ponderación de cambio relativa. En realidad, funciona como una ponderación relativa máxima, que luego implicaría algunas matemáticas complejas para determinar las probabilidades relativas reales involucradas.
No estoy seguro de qué se puede hacer con T-SQL directo. Implementé un selector de probabilidad ponderado muchas veces (incluso irónicamente, iba a hacer una pregunta sobre los mejores métodos para esto esta mañana) pero siempre en código.
ORDER BY RAND() puede ser muy lento con grandes conjuntos de datos, ya que es O (n log (n)). ¿Cuántas filas tendrá tu mesa? –