Учитывая ваше выше заявление SQL, независимо от числа вы имеете в cur_odds
являются не вероятности того, что выбрана в каждой строке, но вместо этого просто произвольного взвешивания (по отношению к «весам» все остальных строк), которые могли бы вместо этого лучше всего интерпретировать как относительную тенденцию плавать к вершине отсортированной таблицы. Фактическое значение в каждой строке не имеет смысла (например, вы могли бы иметь 4 строки со значениями 0,35, 0,5, 0,75 и 0,99, или вы могли бы иметь значения 35, 50, 75 и 99, и результаты были бы одинаковыми).
Обновление: Подробнее о том, что происходит с вашим запросом. У вас есть одна строка с cur_odds
значением 0,35. Для иллюстрации я предполагаю, что остальные 9 строк имеют одинаковое значение (0.072). Также для иллюстрации предположим, что RAND() возвращает значение от 0.0 до 1.0 (это может быть фактически).
Каждый раз, когда вы запускаете этот оператор SELECT, каждой строке присваивается значение сортировки путем умножения значения cur_odds
на значение RAND() от 0.0 до 1.0. Это означает, что строка с 0,35 будет иметь значение сортировки между 0.0 и 0.35.
Каждая другая строка (со значением 0.072) будет иметь значения сортировки в диапазоне от 0,0 до 0,072. Это означает, что вероятность того, что ваша одна строка будет иметь значение сортировки, превышающее 0.072, будет примерно на 80%, что означает, что существует отсутствие возможной вероятности, что любая другая строка может быть отсортирована выше. Вот почему ваша строка с cur_odds
значением 0,35 приближается первым чаще, чем вы ожидаете.
Я неправильно описал значение cur_odds
как относительное изменение веса. Он фактически функционирует как максимальное относительное взвешивание, которое затем включало бы некоторую сложную математику для определения фактических относительных вероятностей.
Я не уверен, что вам нужно сделать с помощью прямого T-SQL. Я неоднократно реализовывал взвешивающий сборщик вероятностей (я даже собирался задать вопрос о лучших методах для этого сегодня утром, по иронии судьбы), но всегда в коде.
ORDER BY RAND() может быть очень медленным с большими наборами данных, так как это O (n log (n)). Сколько строк будет у вашей таблицы? –