2 zzwzxzs444 zzwzxzs444 于 2013.09.23 18:44 提问

oracle 或者 java 通过概率取得对应的值

现在我有1张表

字段如下

ID QUEUE_PRIORITY
1 100
2 200
3 10000
4 500

QUEUE_PRIORITY 表示 被取到的概率值

我想 通过概率 取2个值出来 意思就是 取到 2的概率 是 200/(100+200+10000+500)

怎么排序法 求大大指教

2个回答

sasuke38
sasuke38   2013.09.24 09:36
你的意思是根据概率进行排序么


那么你给出的数据根据概率进行排序   升序是
1 100
2 200
4 500
3 10000

毫无疑问只要排序QUEUE_PRIORITY的值即可

如果你还想取得指定的概率的值的话  在排序的时候需要QUEUE_PRIORITY/总和   然后保存到map中   键是id  值是QUEUE_PRIORITY    sql语句我不太会写   java代码这样子可以   更高效的方法还没想出来
zzwzxzs444
zzwzxzs444 不是根据概率来排序 也不是求概率值 而是 随机取一条记录 但是QUEUE_PRIORITY中值越高的那条记录 被取到的概率越大
大约 4 年之前 回复
asiaasia666
asiaasia666   2013.09.24 12:50

1,新建一个新表test_b
test_b{
id integer 主键,
table_a_id integer 你的第一张TABLE的主键
}
2,向test_b中插入数据,结果为
id table_a_id
1 1
2 1
3 1
4 1
……
100 1 (注,第一张表中id=1的QUEUE_PRIORITY为100,这里插入100条数据)
101 2
102 2
103 2
……
300 2 (注,第一张表中id=2的QUEUE_PRIORITY为200,这里插入200条数据)
。。。。。(注,第一张表中id=3的QUEUE_PRIORITY为10000,这里插入10000条数据)
。。。。。(注,第一张表中id=4的QUEUE_PRIORITY为500,这里插入500条数据)
3,第一张表中所有QUEUE_PRIORITY求和为10800,再使用

select cast(DBMS_RANDOM.VALUE(0, 10800) as int) from dual;
你会得到一个随机数字 int_random,

select * from 你的第一张表 as ta
where exists (select 1 from test_b where id= int_random 
              and table_a_id = ta.id)

这就是你的结果了。

Csdn user default icon
上传中...
上传图片
插入图片