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

          都市淘沙者

          荔枝FM Everyone can be host

          統(tǒng)計

          留言簿(23)

          積分與排名

          優(yōu)秀學習網站

          友情連接

          閱讀排行榜

          評論排行榜

          Oracle中隨機抽取N條記錄

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

          方法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/

          主站蜘蛛池模板: 青龙| 涪陵区| 九台市| 阳城县| 永春县| 济阳县| 嘉荫县| 肇庆市| 台湾省| 修水县| 盐边县| 翁源县| 高安市| 广丰县| 罗源县| 蚌埠市| 新巴尔虎左旗| 犍为县| 凭祥市| 白玉县| 兴安县| 屏南县| 北辰区| 中牟县| 错那县| 黑山县| 福贡县| 怀远县| 红原县| 高雄县| 邵阳市| 股票| 柘城县| 临泽县| 胶南市| 东山县| 金沙县| 祁东县| 綦江县| 夏邑县| 长汀县|