按不同的概率选择随机行 - SQL

6
我希望能够根据不同的概率列选择随机行:
ID     Type
Bike   1
Moto   1
Asus   2
Car    1
Apple  2
John   3

如果我这样做,将会有随机的概率:

按 newid() 排序并选择顶部 1 个 * 从 Items 中

我希望 John(类型 3)有 70% 的概率获得,类型 1 有 5% 的概率,类型 2 有 25% 的概率。


2个回答

4
我建议使用 RAND() 函数代替 NEWID()
使用 RAND(),我们可以生成一个 1 到 100 之间的随机数,然后使用 CASE 语句根据生成的随机数选择一个 type
根据 MSDN 的说明:

RAND() 返回一个伪随机浮点值,范围是从 0 到 1(不包括 1)。

这意味着将 RAND() 乘以 100 将给出一个从 0 到 99 的数字。加上 1 将范围更改为 1 到 100。
如果在选择要返回的 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()

查看此处...运行几次以确保结果与概率相匹配。


+1 的意义是什么?它似乎会扰乱百分比,使得 1 的概率为 4%,2 的概率为 25%,3 的概率为 71%。 - Eric J. Price
@Love2Learn,我更新了答案并解释了+1的原因。如果没有它,范围将基于RAND()的可能返回值为0到99。 - Michael Fredrickson
是的,我刚注意到你在隐式转换为int,没错。我认为你需要调整范围,因为只有4次机会得到1,25次机会得到2,71次机会得到3。将3改为31+,将2改为6到30? - Eric J. Price
@Love2Learn 你说得对...谢谢指出!现在应该已经修复了。 - Michael Fredrickson

1
你是指整个type=1组的概率为5%,还是想让每个type=1记录都有5%的被选中的概率? 如果是第二种选择,则您有70+15+50 = 135 = 绝无可能实现。 如果是第一种选择,则您需要进行两次抽奖-首先是类型,然后是该类型中的一行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接