【oracle】-随机抽样N条记录

来源:互联网 发布:淘宝怎么设置淘宝客 编辑:程序博客网 时间:2024/04/27 09:01

第一部分:Oracle访问数据的基本方法
1全表扫描(Full table Scan):执行全表扫描,Oracle读表中的所有记录,考查每一行是否满足WHERE条件。Oracle顺序的读分配给该表的每一个数据块,且每个数据块Oracle只读一次.这样全表扫描能够受益于多块读。
2采样表扫描(sample table scan):扫描返回表中随机采样数据,这种访问方式需要在FROM语句中包含SAMPLE选项或者SAMPLE BLOCK选项。


第二部分:获取随机结果集的方法
1使用sample获取随机结果集sample只对单表生效,不能用于表连接、远程表、视图
  1-1、语法:SAMPLE [BLOCK ](sample_percent)[SEED (seed_value) ]
     SAMPLE:表示按行采样来执行一个全表扫描,Oracle从表中读取特定百分比的记录,并判断是否满WHERE子句以返回结果。
     BLOCK表示使用随机块例举而不是随机行例举
     sample_percent:是随机获取一张表中记录的百分比。比如值为10,那就是表中的随机的百分之10的记录。值必须大于等于.000001,小于100。
     SEED:表示从哪条记录返回,类似于预先设定例举结果,因而每次返回的结果都是固定的。该值必须介于和4294967295之间。
1-2、实例 

   --从表WM_ASN_HEADER “全表扫描”随机抽取20%的记录,再从中随机查询5条记录
    SELECT   *
     FROM   WM_ASN_HEADER SAMPLE (20)
     WHERE   ROWNUM <= 5;
  
     --WM_ASN_HEADER“采样表扫描”随机抽取10%的记录,再从中随机查询5条记录
    SELECT   *
     FROM  WM_ASN_HEADER SAMPLE BLOCK (10)
     WHERE   ROWNUM <= 5;


    --使用seed,返回固定的结果集。
    SELECT   *
     FROM   WM_ASN_HEADER SAMPLE (10) SEED (3)
     WHERE   ROWNUM <= 5

 

2、使用DBMS_RANDOM包
有两种主要的使用方法分别是:DBMS_RANDOM.VALUE()DBMS_RANDOM.RANDOM
 2-1、获取一个随机数
   获取0-10的一个随机整数
   SELECT   TRUNC(DBMS_RANDOM.VALUE (0, 10)) ramFROM DUAL;
 获取0-100的一个随机浮点数
   SELECT   DBMS_RANDOM.VALUE (0, 100) ram FROM DUAL;
 获取一个0.几的小数
   SELECT   DBMS_RANDOM.VALUE () randomNum FROM DUAL;
2-2、获取随机记录
    SELECT   *
      FROM   (  SELECT   *
                  FROM   WM_ASN_HEADER
               ORDER BY  DBMS_RANDOM.VALUE)
     WHERE   ROWNUM <= 3

    SELECT   *
      FROM   (  SELECT   *
   ORDER BY  DBMS_RANDOM.VALUE(1,3))
     WHERE   ROWNUM <= 3

    SELECT   *
      FROM   (  SELECT   *
                  FROM   WM_ASN_HEADER             

         ORDER BY  DBMS_RANDOM.random)
     WHERE   ROWNUM <= 3

2-3、获取下拉框的随机记录

Select CASE MOD(ABS(DBMS_RANDOM.random), 3)

         WHEN 1 THEN

          '入库'

         when 2 then

          '出库'

         ELSE

          '收货'

       END STATUS

  from dual

connect by level <= 10;


3、使用内部函数sys_guid()

    SELECT   *
      FROM   (  SELECT   *
                  FROM   WM_ASN_HEADER                    

ORDER BY   sys_guid() )

     WHERE   ROWNUM <= 3


原创粉丝点击