我希望选择具有不同概率列的随机行:
ID Type
Bike 1
Moto 1
Asus 2
Car 1
Apple 2
John 3
如果我这样做,我会有随机概率:
通过newid()
从项目顺序中选择前1 *
我希望John(类型3)获得的概率为70%,类型1为5%,类型2为25%。
答案 0 :(得分:4)
我会使用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 ...运行几次以查看结果与概率匹配。
答案 1 :(得分:1)
您的意思是整个类型= 1组的概率为5%,或者您希望每个类型= 1的记录有5%的概率被选中? 如果这是第二个选项,那么你有70 + 15 + 50 = 135 =你无法做到这一点。 如果它是第一个选项,那么你必须进行2次绘制 - 首先是一个类型,然后是这种类型的一行。