Compte tenu de votre instruction SQL ci-dessus, quel que soit le nombre que vous avez dans cur_odds
sont pas les probabilités que chaque ligne est sélectionnée, mais est plutôt juste une pondération arbitraire (par rapport aux « poids » de toutes les autres lignes) qui pourraient plutôt être interprété comme une tendance relative à flotter vers le haut de la table triée. La valeur réelle de chaque ligne n'a aucun sens (par exemple, vous pourriez avoir 4 lignes avec des valeurs de 0,35, 0,5, 0,75 et 0,99, ou vous pourriez avoir des valeurs de 35, 50, 75 et 99, et les résultats seraient les mêmes).
Mise à jour: Voici ce qui se passe avec votre requête. Vous avez une ligne avec une valeur cur_odds
de 0,35. Par souci d'illustration, je vais supposer que les 9 autres lignes ont toutes la même valeur (0.072). Toujours à titre d'exemple, supposons que RAND() renvoie une valeur de 0.0 à 1.0 (il peut en fait).
Chaque fois que vous exécutez cette instruction SELECT, une valeur de tri est affectée à chaque ligne en multipliant sa valeur cur_odds
par une valeur RAND() comprise entre 0,0 et 1,0. Cela signifie que la ligne avec un 0.35 aura une valeur de tri entre 0.0 et 0.35.
Chaque ligne (avec une valeur de 0,072) aura des valeurs de tri comprises entre 0,0 et 0,072. Cela signifie qu'il y a environ 80% de chances que votre rangée aura une valeur de tri supérieure à 0,072, ce qui signifierait qu'il n'y a aucune chance que toute autre rangée puisse être triée plus haut. C'est pourquoi votre ligne avec la valeur cur_odds
de 0.35 arrive en premier plus souvent que prévu.
J'ai incorrectement décrit la valeur cur_odds
comme une pondération de modification relative. Il fonctionne réellement comme une pondération relative maximale, ce qui impliquerait alors des calculs complexes pour déterminer les probabilités relatives réelles impliquées.
Je ne suis pas sûr que ce dont vous avez besoin peut être fait avec T-SQL directement. J'ai mis en œuvre un sélecteur de probabilité pondéré à plusieurs reprises (j'allais même poser une question sur les meilleures méthodes pour ce matin, ironiquement) mais toujours dans le code.
ORDER BY RAND() peut être très lent avec de grands ensembles de données comme c'est O (n log (n)). Combien de lignes aura votre table? –