这是一个关于概率的问题,需求是这样的,有一张表时胡一个字段叫星级:“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,等等。
谁能写出这样的查询语句?或给出解决这个问题的思路也行。

解决方案 »

  1.   

    我每一次可能只查2条记录,但每次查询的结果都是随机的,但这个随机是有条件的:"star_level"字段的值越大,每次查询到的机会也要越大。
      

  2.   

    select ID,name,star_level from (select ID,name,star_level,round(dbms_random.value(1,15))-star_level t from tbl_A) where t<=0
    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
      

  3.   

    悄悄地说一下: 为什么这样的逻辑要写在DB SQL里呢??
    用JAVA或C#写概率的逻辑,然后把结果传到SQL里不就行了么
      

  4.   

    大概理解你的意思了,也謝謝waterfirer(水清) 的提示。
    如果非要在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)
      

  5.   

    select round(dbms_random.value(1,15)) a from dual
      

  6.   

    楼主想要的是查询的内容的出现概率,这个概率是根据Star_level来实现吗?
      

  7.   

    to SmallHand(火龍)是你这个意思,Star_level的值越大,本条记录在做随机查询时出现的机会就大。
      

  8.   

    to: sozdream() 这是一个题库系统,每天晚上自动组成N套试卷,偶是要写一个存贮过程每天晚上都要重新组卷,其中一个条件就是根据字段star_level(星级)的大小来选择试题,让星级越高的试题,出现的机会越大。
      

  9.   

    to : waterfirer(水清) ,yqwd911(windy)以下语句怎么体现字段:star_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)
      

  10.   

    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()取得的应该不是完全的随机数吧,只能算是伪随机数吧
      

  11.   

    好奇:为什么这样的算法不写在程序里呢?
    写在SQL里面有什么好处呢?
      

  12.   

    to xiaoxiao1984(潇潇)在上面我已经说过了,我是要写一个存贮过程,并且每天都要自动执行的。如果在java或C++中写也有同样的问题!
      

  13.   

    to 樓主
    我寫的語句是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(潇潇)
    什麽是偽隨機數?
      

  14.   

    to : waterfirer(水清) ,yqwd911(windy)两位的写法可能一条数据都没有。比如有10条数据,我必须要4条,像你们这样的写法,可能得不到4条数据。asusa3a(金为床兮银为椅)
    我不一定非要5星的出现5次,只是想让它出现的机会更大一些。可能在某一次查询中5星的一条都没有。
      

  15.   

    可能得不到4条数据
    ---------------
    只显示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,只起到一个调节的作用
      

  16.   

    感谢waterfirer(水清)同志的热情帮忙,还是觉得你最后的方法比较可行。