4

我想选择具有不同概率列的随机行:

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%。

4

2 回答 2

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()

在此处查看...运行几次以查看结果是否与概率匹配。

于 2013-03-21T15:35:40.847 回答
1

您的意思是整个 type=1 组的概率为 5%,或者您希望 type=1 的每条记录都有 5% 的概率被选中?如果是第二种选择,那么你有 70+15+50=135 = 你不可能做到这一点。如果它是第一个选项,那么您必须进行 2 次抽奖 - 首先是针对一种类型,然后是针对这种类型的一行。

于 2013-03-21T15:37:57.510 回答