oracle中隨機抽取N條記錄

 From:http://www.orafans.net/2006/09/oracle-random-record.html

 

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

方法1:使用SAMPLE()。

使用sample的語法是:

  1. SAMPLE 
  2. [ BLOCK ] (sample_percent) 
  3. [ SEED (seed_value) ]  
 

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

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

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

接下來舉例說明:

  1. SQL> create table zeeno as select * from dba_objects; 
  2.    
  3. Table created. 
  4.    
  5. SQL> select object_name from zeeno sample(10) where rownum=1; 
  6.    
  7. OBJECT_NAME 
  8. ------------------------------------------------------------- 
  9.    
  10. UET$ 
  11.    
  12. SQL> / 
  13.    
  14. OBJECT_NAME 
  15. ------------------------------------------------------------- 
  16.    
  17. ICOL$ 
上面的示例表示從表zeeno中隨機抽取10%的記錄,並從中選擇一條記錄。

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

  1. 1* select object_name from zeeno sample(10) seed(10) where rownum=1 
  2. SQL> / 
  3.    
  4. OBJECT_NAME 
  5. --------------------------------------------------------------------- 
  6.    
  7. PROXY_ROLE_DATA$ 
  8.    
  9. SQL> / 
  10.    
  11. OBJECT_NAME 
  12. --------------------------------------------------------------------- 
  13.    
  14. PROXY_ROLE_DATA$ 
只所以建臨時表是因爲如下原因:
 
  1. SQL> select object_name from dba_objects sample(10)where rownum=1; 
  2. select object_name from dba_objects sample(10)where rownum=1 
  3. ERROR at line 1: 
  4. ORA-01446: cannot select ROWID fromor sample, a view with DISTINCTGROUP BY
  5. etc. 
方法2:使用DBMS_RANDOM包。

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

  1. SQL> select dbms_random.value() from dual; 
  2.    
  3. DBMS_RANDOM.VALUE() 
  4. ------------------- 
  5. .638206012 
  6.    
  7. SQL> / 
  8.    
  9. DBMS_RANDOM.VALUE() 
  10. ------------------- 
  11. .312828706 
  12.    
  13. SQL> select dbms_random.value(1,10) from dual 
  14.    
  15. DBMS_RANDOM.VALUE(1,10) 
  16. ----------------------- 
  17. 2.49371361 
  18.    
  19. SQL> / 
  20.    
  21. DBMS_RANDOM.VALUE(1,10) 
  22. ----------------------- 
  23. 1.6890498 
 

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

  1. SQL> select * from (select object_name from zeeno 
  2. 2                 order by dbms_random.random) 
  3. 3  where rownum=1; 
  4.    
  5. OBJECT_NAME 
  6. ------------------------------------------------- 
  7.    
  8. DBMS_JAVA_TEST 
  9.    
  10. SQL> / 
  11.    
  12. OBJECT_NAME 
  13. ------------------------------------------------- 
  14.    
  15. USER_SNAPSHOT_REFRESH_TIMES 
  16.    
  17. SQL> select * from (select object_name from zeeno 
  18. 1                 order by ceil(dbms_random.value(1,3)) 
  19. 2                ) 
  20. 3*  where rownum=1 
  21.    
  22. OBJECT_NAME 
  23. ---------------------------------------------------------- 
  24.    
  25. UNDO$ 
  26.    
  27. SQL> / 
  28.    
  29. OBJECT_NAME 
  30. ---------------------------------------------------------- 
  31.    
  32. I_USER1 
 

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

 

其他數據庫隨機取出n條記錄:

1、SqlServer中隨機提取數據庫記錄

  1. select top n * from table_name order by newid()  

2、mysql中隨機提取數據庫記錄

  1. Select * From table_name order By rand() Limit n 


3、Access中隨機提取數據庫記錄

  1. Select top n * FROM table_name orDER BY Rnd(FId) 

FId:爲你當前表的ID字段名

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章