Dict.CN 在線詞典, 英語學習, 在線翻譯

          都市淘沙者

          荔枝FM Everyone can be host

          統計

          留言簿(23)

          積分與排名

          優秀學習網站

          友情連接

          閱讀排行榜

          評論排行榜

          Oracle中隨機抽取N條記錄

          工作中經常用到隨機數,比如隨機抽取獎券,隨機抽取某地區的客戶樣本等。在Oracle中可以非常方便地實現這個功能。

          方法1:使用SAMPLE()。

          使用sample的語法是:

          SAMPLE [ BLOCK ]
          (sample_percent)
          [ SEED (seed_value) ]

          BLOCK: 表示使用隨機塊例舉而不是隨機行例舉。

          sample_percent是隨機獲取一張表中記錄的百分比。比如值為10,那就是表中的隨機的百分之10的記錄。值必須大于等于.000001,小于100。

          seed表示從哪條記錄返回,類似于預先設定例舉結果,因而每次返回的結果都是固定的。該值必須介于0和4294967295之間。

          接下來舉例說明:

          SQL> create table zeeno as select * from dba_objects;

           

          Table created.

          SQL> select object_name from zeeno sample(10) where rownum=1;

          OBJECT_NAME
          -------------------------------------------------------------

          UET$

          SQL> /

          OBJECT_NAME
          -------------------------------------------------------------

          ICOL$

          上面的示例表示從表zeeno中隨機抽取10%的記錄,并從中選擇一條記錄。

          如果使用seed,則返回固定的集。

          1* select object_name from zeeno sample(10) seed(10) where rownum=1
          SQL> /

           

          OBJECT_NAME
          ---------------------------------------------------------------------

          PROXY_ROLE_DATA$

          SQL> /

          OBJECT_NAME
          ---------------------------------------------------------------------

          PROXY_ROLE_DATA$

          只所以建臨時表是因為如下原因:

          SQL> select object_name from dba_objects sample(10)where rownum=1;
          select object_name from dba_objects sample(10)where rownum=1
          *
          ERROR at line 1:
          ORA-01446: cannot select ROWID from, or sample, a view with DISTINCT, GROUP BY,
          etc.

          方法2:使用DBMS_RANDOM包。

          DBMS_RANDOM有兩種主要的使用方法,分別是DBMS_RANDOM.VALUE()和DBMS_RANDOM.RANDOM。

          SQL> select dbms_random.value() from dual;

           

          DBMS_RANDOM.VALUE()
          -------------------
          .638206012

          SQL> /

          DBMS_RANDOM.VALUE()
          -------------------
          .312828706

          SQL> select dbms_random.value(1,10) from dual

          DBMS_RANDOM.VALUE(1,10)
          -----------------------
          2.49371361

          SQL> /

          DBMS_RANDOM.VALUE(1,10)
          -----------------------
          1.6890498

          有了隨機數,抽取隨機記錄就是一件非常輕松的事情了:

          SQL> select * from (select object_name from zeeno
          2 order by dbms_random.random)
          3 where rownum=1;

           

          OBJECT_NAME
          -------------------------------------------------

          DBMS_JAVA_TEST

          SQL> /

          OBJECT_NAME
          -------------------------------------------------

          USER_SNAPSHOT_REFRESH_TIMES

          SQL> select * from (select object_name from zeeno
          1 order by ceil(dbms_random.value(1,3))
          2 )
          3* where rownum=1

          OBJECT_NAME
          ----------------------------------------------------------

          UNDO$

          SQL> /

          OBJECT_NAME
          ----------------------------------------------------------

          I_USER1

          通常情況下我更喜歡使用SAMPLE,因為更加方便。

          posted on 2007-12-04 17:22 都市淘沙者 閱讀(1544) 評論(0)  編輯  收藏 所屬分類: Oracle/Mysql/Postgres/

          主站蜘蛛池模板: 丰镇市| 东莞市| 临湘市| 榆树市| 临江市| 垦利县| 呈贡县| 侯马市| 恩施市| 天柱县| 弥渡县| 思茅市| 九龙城区| 渑池县| 南城县| 永定县| 襄汾县| 广河县| 新兴县| 虹口区| 佛坪县| 云南省| 旌德县| 山丹县| 南岸区| 平定县| 旺苍县| 吴江市| 灌阳县| 肃宁县| 蓬溪县| 米林县| 乾安县| 无棣县| 兰州市| 库尔勒市| 武城县| 普格县| 芦山县| 铜川市| 蒲城县|