这是一个关于概率的问题,需求是这样的,有一张表时胡一个字段叫星级:“star_level”,就和宾馆的几颗星是一样道理,分为1,2,3,4,5,五个等级,现在做这样的一个查询,1星级的出现的概率为1/15,2星级的出现的概率为2/15,以此类推,例如:
表:tbl_A
ID name star_level
---------------------------------------------------
1 AAA 5
2 BBB 3
3 CCC 5
4 DDD 1
要求在每做一次查询时,"AAA"记录出现的概率为5/15,"BBB"记录出现的概率为3/15,等等。
谁能写出这样的查询语句?或给出解决这个问题的思路也行。
表:tbl_A
ID name star_level
---------------------------------------------------
1 AAA 5
2 BBB 3
3 CCC 5
4 DDD 1
要求在每做一次查询时,"AAA"记录出现的概率为5/15,"BBB"记录出现的概率为3/15,等等。
谁能写出这样的查询语句?或给出解决这个问题的思路也行。
select ID,name,star_level from (select ID,name,star_level,mod(abs(dbms_random.random),15)-star_level t from tbl_A) where t<=0
用JAVA或C#写概率的逻辑,然后把结果传到SQL里不就行了么
如果非要在SQL裏實現可以試試這個語句。
select tab_A.*
from tab_A,
(select (case when a between 1 and 5 then 1
when a between 6 and 9 then 2
when a between 10 and 12 then 3
when a between 13 and 14 then 4
else 5 end) start_level
from (select round(dbms_random.value(1,15)) a from dual)) ran
where tab_A.start_level=ran.start_level其中下面這個sql語句目的是按照出現幾率生成start_level
select (case when a between 1 and 5 then 1
when a between 6 and 9 then 2
when a between 10 and 12 then 3
when a between 13 and 14 then 4
else 5 end) start_level
from (select round(dbms_random.value(1,15)) a from dual)
select (case when a between 1 and 5 then 1
when a between 6 and 9 then 2
when a between 10 and 12 then 3
when a between 13 and 14 then 4
else 5 end) start_level
from (select round(dbms_random.value(1,15)) a from dual)
那么a随机取得1-15之间的数据,机会均等,1/15
现在如果需要5/15 的可能性,只需要取得 1=<a<=5就可以了,因为a取得1,2,3,4,5的可能性都是1/15,所以取得[1,5]之间的可能性就是累加后的5/15
同理可以取得其他的可能性;
不过,好奇,dbms_random.value()取得的应该不是完全的随机数吧,只能算是伪随机数吧
写在SQL里面有什么好处呢?
我寫的語句是1出現的概率為5/15,2的為4/15,3的為3/15...5的為1/15
level越低出現概率約大,如果你要的是相反的那麽就把then後面的數字換一下就可以了。select (case when a between 1 and 5 then 5
when a between 6 and 9 then 4
when a between 10 and 12 then 3
when a between 13 and 14 then 2
else 1 end) start_level
from (select round(dbms_random.value(1,15)) a from dual)to xiaoxiao1984(潇潇)
什麽是偽隨機數?
我不一定非要5星的出现5次,只是想让它出现的机会更大一些。可能在某一次查询中5星的一条都没有。
---------------
只显示4条数据
select ID,name,star_level from (select ID,name,star_level from tbl_A order by dbms_random.value*(1+star_level/15) desc) where rownum<5select ID,name,star_level from (select ID,name,star_level from tbl_A order by dbms_random.value*(1+star_level/k) desc) where rownum<5通过k可以调节概率,上面的15并不表示1星级的出现的概率为1/15,只起到一个调节的作用