首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在具有相同值的多个实例的SQL中选择随机

在具有相同值的多个实例的SQL中选择随机
EN

Stack Overflow用户
提问于 2015-05-07 16:02:43
回答 2查看 127关注 0票数 1

请考虑以下几点:

代码语言:javascript
复制
user_id weight
      1   2
      2   5

是否有查询可以随机选择用户ID,同时使用权重来影响选择哪个ID的概率?

换句话说,在这种情况下,是否有一个查询会查看此表,然后从以下组随机选择1个用户ID:

代码语言:javascript
复制
[UserID_001, UserID_001, UserID_002, UserID_002, UserID_002, UserID_002,  UserID_002]

因此,UserID_002被选中的几率为5/7,而UserId_001被选中的概率为2/7。

这就像每个用户在抽奖中都有很多票,User_001有2张票,User_002有5张票。用SQL查询可以做这样的事情吗?还是我需要用别的方法?

提前感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-07 16:22:16

你想要一个加权抽样。这其实很简单,一旦你有了所有权重的累积和。

代码语言:javascript
复制
select t.*
from (select t.*,
             (@w := @w + weight) as cumew
      from table t cross join
           (select @w := 0) init
     ) t
where @w * rand() <= cumew
order by weight
limit 1;

注意,在外部查询中,@w是所有权重之和。因此,它将这个值乘以一个随机数,并找到大于或等于这个值的第一个累积权重。

票数 1
EN

Stack Overflow用户

发布于 2015-05-07 17:05:26

这是你的彩票的解决方案:-)

如果您需要了解它是如何工作的,只需注释查询WHERE ...的最后一行

http://sqlfiddle.com/#!9/54a44/17

代码语言:javascript
复制
SELECT *
FROM (SELECT *, 
IF(@total IS NULL,@first:=1, @first:=@total+1) from_number,
IF(@total IS NULL,@total:=tickets, @total:=@total+tickets) to_number,
IF(@winner IS NULL,@winner:= FLOOR( 1 + RAND( ) * t_sum.t_all), @winner) win 
FROM tickets
LEFT JOIN (SELECT SUM(tickets) t_all FROM tickets) t_sum
ON 1) t
WHERE win >= from_number AND win <= to_number
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30106262

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档