【问题标题】:Select random row with different probability - SQL选择具有不同概率的随机行 - SQL
【发布时间】:2013-03-11 04:59:51
【问题描述】:

我想选择基于不同概率列的随机行:

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

【问题讨论】:

标签: sql sql-server probability


【解决方案1】:

我会使用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 为 4%,2 为 25%,3 为 71%。
  • @Love2Learn 我用+1 的解释更新了答案。如果没有它,范围将是 0 到 99,具体取决于 RAND() 的可能返回值
  • 是的,刚刚注意到您正在隐式转换为 int,就这样。我认为您需要调整范围,因为 1 仅有 4 次机会,2 为 25 次,3 为 71 次。将 3 更改为 31+,将 2 更改为 6 到 30?
  • @Love2Learn 你是对的......感谢您指出这一点!现在应该修好了。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-20
    • 2023-04-03
    • 1970-01-01
    • 2012-10-13
    • 2012-10-06
    相关资源
    最近更新 更多