我想选择具有不同概率列的随机行:
ID Type
Bike 1
Moto 1
Asus 2
Car 1
Apple 2
John 3
如果我这样做,我将有随机概率:
按 newid() 从 Items order 中选择 top 1 *
我希望约翰(类型 3)有 70% 的概率获得,类型 1 为 5%,类型 2 为 25%。
我想选择具有不同概率列的随机行:
ID Type
Bike 1
Moto 1
Asus 2
Car 1
Apple 2
John 3
如果我这样做,我将有随机概率:
按 newid() 从 Items order 中选择 top 1 *
我希望约翰(类型 3)有 70% 的概率获得,类型 1 为 5%,类型 2 为 25%。
我会使用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()
在此处查看...运行几次以查看结果是否与概率匹配。
您的意思是整个 type=1 组的概率为 5%,或者您希望 type=1 的每条记录都有 5% 的概率被选中?如果是第二种选择,那么你有 70+15+50=135 = 你不可能做到这一点。如果它是第一个选项,那么您必须进行 2 次抽奖 - 首先是针对一种类型,然后是针对这种类型的一行。