Я использовал бы функцию RAND()
вместо NEWID()
.
Используя RAND()
, мы можем сгенерировать случайное число от 1 до 100, а затем использовать оператор CASE
, чтобы выбрать type
на основе числа, генерируемого случайным образом.
В соответствии с MSDN:
RAND()
возвращает псевдослучайное значение с плавающей точкой в диапазоне от 0 до 1, эксклюзивного
Это означает, что умножение RAND()
100 даст нам число от 0 до 99 . Добавление 1 изменяет диапазон от 1 до 100.
Если после выбора, который возвращает type
, вы хотите случайным образом выбрать запись из этого type
, вы можете добавить SELECT TOP 1
... ORDER BY NEWID()
, чтобы получить случайную запись этого типа:
DECLARE @Random INT
SET @Random = (RAND() * 100) + 1
SELECT TOP 1 ID, Type
FROM Items
WHERE Type = CASE
WHEN @Random > 30 THEN 3
WHEN @Random BETWEEN 6 AND 30 THEN 2
ELSE 1
END
ORDER BY NEWID()
See it here ... запустить его несколько раз, чтобы увидеть, что результаты совпадают с вероятностями.
Возможный дубликат [Выбрать случайную строку из таблицы PostgreSQL со взвешенными вероятностями строк] (http://stackoverflow.com/questions/13040246/select-random-row-from-a-postgresql-table-with-weighted- row-probabilities) – Magnus