oracle中隨機抽取N條記錄

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

 

工做中常常用到隨機數,好比隨機抽取獎券,隨機抽取某地區的客戶樣本等。在Oracle中能夠很是方便地實現這個功能。mysql

方法1:使用SAMPLE()。sql

使用sample的語法是:數據庫

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

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

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

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

接下來舉例說明:spa

  
  
           
  
  
  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,則返回固定的集。.net

  
  
           
  
  
  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。htm

  
  
           
  
  
  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條記錄:

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

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

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

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


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

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

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

相關文章
相關標籤/搜索