Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL根据百分比选择随机行_Mysql_Sql - Fatal编程技术网

Mysql SQL根据百分比选择随机行

Mysql SQL根据百分比选择随机行,mysql,sql,Mysql,Sql,基本上,我需要一个随机化器,但不是将所有行平均处理25%,而是根据分配给它的百分比来处理 例如: Event Chance_Percentage A 25.00 B 10.00 C 15.00 D 50.00 我将如何实现这一点 我使用的是MySQL。我的机器上没有安装MySQL,所以这是未经测试的,但我认为这一总体思路会奏效 SELECT Event FROM Your_Table WHER

基本上,我需要一个随机化器,但不是将所有行平均处理25%,而是根据分配给它的百分比来处理

例如:

Event Chance_Percentage
A          25.00
B          10.00
C          15.00
D          50.00
我将如何实现这一点


我使用的是MySQL。

我的机器上没有安装MySQL,所以这是未经测试的,但我认为这一总体思路会奏效

    SELECT Event
      FROM Your_Table
     WHERE CASE WHEN Event = 'A' THEN 
                CASE WHEN RAND() <= .25 THEN 1
                     END
                WHEN Event = 'B' THEN 
                CASE WHEN RAND() <= .1 THEN 1
                     END
                WHEN Event = 'C' THEN 
                CASE WHEN RAND() <= .15 THEN 1
                     END
                WHEN Event = 'D' THEN 
                CASE WHEN RAND() <= .5 THEN 1
                     END
            END = 1;

在Java、Python、C、php、JavaScript等应用程序编程语言中,这应该很容易计算。您可以将所有行选择到应用程序中,然后在易于编写的位置进行计算

如果没有应用程序需要在数据库中执行操作,则不要执行。为正确的工作使用正确的工具。数据库首先用于持久性,而不是计算


另请参见。

更通用的解决方案是:

select e.*, t2.*
  from (
    select event,
      (select coalesce(sum(chance_percentage), 0) 
         from table1 t2 where t2.event < t1.event) as lower_bound,
      (select sum(chance_percentage) 
         from table1 t3 where t3.event <= t1.event) as upper_bound
      from table1 t1) e
  join (select 100.0 * rand() as p) t2
    where t2.p >= e.lower_bound and t2.p < e.upper_bound;

如果您只想选择一个proba等于百分比的字段

我认为这样做会很好: 设置@mybound:=RAND*100; 从概率百分比<@mybound的事件中选择*
随机订购\u百分比描述限制1

做一个累积和,然后运行rand一次:


您使用的是什么数据库管理系统?随机数生成器的语法将有所不同。@Error\u 2646我正在使用MySql@dfundako我自己做了研究,并试图找出答案,但它将它们分别视为25%。@confusedOne显示代码。这只是从mytable order by rand limit 1中进行的正常选择*。我不知道该怎么办。我提供的表格只是一个例子,在我的真实表格中,我有1400多行,百分比是根据总和/总的总数计算的,没有两个百分比是相同的。因此,我不认为手动定义案例是正确的方法,因为它们是1400个唯一的百分比:/@confusedOne我不关心1400行的性能。我一般不会关心CASE语句的性能,除非它们在连接条件中。在您的示例中,CASE的顺序很重要。如果%是9%,那么B和C都无法达到,因为我很确定它们在A条件检查时会短路。@confusedOne您必须给出一个代表您的问题的示例。如果百分比基于其他数据发生变化,则这是另一个问题。每次调用时都会重新计算rand。这可能不会返回任何行。你是对的,我只是让这对我自己更难。@confusedOne。一点也不。这在SQL中很容易计算。将为每一行重新计算rand。这可能不会返回任何内容。
select t.event
from (select t.*, (@cume_p = @cume_p + p) as cume_p
      from t cross join
           (select @cume_p := 0, @rand = rand()) params
     ) t
where @rand >= cume_p - p and
      @rand < cume_p;
select t.event
from (select t.*, (@cume_p = @cume_p + p) as cume_p
      from t cross join
           (select @cume_p := 0) params
     ) t cross join
     (select rand() as r) r
where r.r >= cume_p - p and
      r.r < cume_p;