发新话题
打印

随机取表中数据

随机取表中数据

在pl/sql中有张1000条记录的表。如果想随机抽取其中50条记录该如何操作呢?

TOP

这跟具体的数据库无关,是如何随机取50条记录的问题。

可以用程序实现,用一条sql语句实现不了!!

TOP

看看对数据表的rownum字段的操作能不能完成机随抽取记录。
I Love Computer & DataBase & Information of Computer
QQ:22167591
URL:http://wzxlog.bokee.com (数据库,Linux,社会大观)

TOP

select * from dist sample(1) where rownum < 10

TOP

使用 dbms random value的一种方法
复制内容到剪贴板
代码:
SQL> select *from (select *from t order by dbms_random.value) where rownum<10;

         A
----------
        39
       101
       134
         5
        83
        97
        96
       140
        81

已选择9行。

SQL> select *from (select *from t order by dbms_random.value) where rownum<10;

         A
----------
        27
       118
       141
       103
       128
        10
       142
        68
        74

TOP

楼上的好像不正确呀,他的问题是:
在pl/sql中有张1000条记录的表。如果想随机抽取其中50条记录该如何操作呢?

利用select *from (select *from t order by dbms_random.value) where rownum<50;
只会随机取出50个数,万一这10个数中又不在表中的呢?
所以关键为从表中随机取出50个数!!!

TOP

试试我的,嘿

TOP

楼上的:
复制内容到剪贴板
代码:
select * from dist sample(1) where rownum < 10
也不行,因为上面的语句每次取出的信息基本一致,不是随机的!!!

TOP

引用:
Originally posted by SunnyXu at 2004-6-22 08:58 AM:
楼上的好像不正确呀,他的问题是:
在pl/sql中有张1000条记录的表。如果想随机抽取其中50条记录该如何操作呢?

利用select *from (select *from t order by dbms_random.value) where rownum<50;
只会随机 ...
select * from (select * from t order by trunc(dbms_random.value(0,1000)))
where rownum<50

这样可以保证产生的随机数在0---1000之间!

[ Last edited by Oracky on 2004-6-23 at 02:34 PM ]

TOP

引用:
Originally posted by SunnyXu at 2004-6-22 08:58 AM:
楼上的好像不正确呀,他的问题是:
在pl/sql中有张1000条记录的表。如果想随机抽取其中50条记录该如何操作呢?

利用select *from (select *from t order by dbms_random.value) where rownum<50;
只会随机 ...
复制内容到剪贴板
代码:
ops$[email]tkyte@ORA817DEV.US.ORACLE.COM[/email]> /*
DOC>
DOC>drop table t;
DOC>
DOC>create table t as select * from all_objects where rownum <= 5000;
DOC>*/
ops$[email]tkyte@ORA817DEV.US.ORACLE.COM[/email]>
ops$[email]tkyte@ORA817DEV.US.ORACLE.COM[/email]> set timing on
ops$[email]tkyte@ORA817DEV.US.ORACLE.COM[/email]>
ops$[email]tkyte@ORA817DEV.US.ORACLE.COM[/email]>
ops$[email]tkyte@ORA817DEV.US.ORACLE.COM[/email]> select object_name, object_id
  2    from ( select object_name, object_id
  3                     from t
  4                    where object_name like '%%'
  5                    order by dbms_random.random )
  6   where rownum <= 4;

OBJECT_NAME                     OBJECT_ID
------------------------------ ----------
/65ddadec__TimeoutImplBase          31405
/a2efb14b_Manager                   30951
/782c5acd_XSDFactory                44004
/b7b4a7fc_BorderUIResourceBeve       7980

Elapsed: 00:00:00.57
ops$[email]tkyte@ORA817DEV.US.ORACLE.COM[/email]> /

OBJECT_NAME                     OBJECT_ID
------------------------------ ----------
/8d664d2f_ObjectBuilder             43951
/ae48c769_DynaHashTest2             14703
/860c1d1e_HandlerRegistryClien      30343
/6fbd66b5_BeanContextServicesS       8840

Elapsed: 00:00:00.56
ops$[email]tkyte@ORA817DEV.US.ORACLE.COM[/email]> select object_name, object_id
  2    from ( select object_name, object_id
  3                     from t sample ( 1 )
  4                    where object_name like '%%'
  5                    order by dbms_random.random )
  6   where rownum <= 4;

OBJECT_NAME                     OBJECT_ID
------------------------------ ----------
/4ff59575_MetalComboBoxUIMetal       7336
/65fabb7f_ServerInterceptorFac      30355
/7ad01403_schemasHolder             31442
/68f6d056_HTMLDocumentHTMLRead       9498

Elapsed: 00:00:00.01
ops$[email]tkyte@ORA817DEV.US.ORACLE.COM[/email]> /

OBJECT_NAME                     OBJECT_ID
------------------------------ ----------
/7e51c6b4_JspBeanFieldInfo          35358
/858cce89_WrappedPlainViewWrap       9450
/19c0b889_NotEmptyHelper            32240
/a995fc24_DropTargetContextPee      10144

Elapsed: 00:00:00.01
ops$[email]tkyte@ORA817DEV.US.ORACLE.COM[/email]>
ops$[email]tkyte@ORA817DEV.US.ORACLE.COM[/email]> set timing off



Using sample made this much faster (but the poster must be on a teeny tiny
machine if it took them 8 seconds to do 5000 rows)
Interesting solution.  I am responding to a reply why the
dbms_random works.

Doesn't the order by dbms_random do the same as:
select *
  from ( select empno, ename, dbms_random.value
           from emp
          where ename like '%'
          order by 3 )
where rownum <= 4

It is confusing that you can specify a number as the order by column or a column
name, or function, if the order by is a function, it is applied to each record
returned and then ordered by that value.  Similar to order by substr(ename, 3).

TOP

玉面飞龙所介绍的方法好使,我已经在oracle上试过了,非常好使

TOP

讨厌英文!~!~能用中文嘛!!真的好昏!

TOP

效率最高的情形是
复制内容到剪贴板
代码:
select a.* sample(1) from tb1 where ....
效率稍差的情形
复制内容到剪贴板
代码:
select * from (
select dbms_utility.get_hash_value(
   to_char(dbms_utility.get_time)||tb1.col1,2,1048576) rand_num,a.*
from tb1 order by rand_num
) where rand_num <=50
效率最差的情形
使用dbms_random取得随机数,再取出对应的随即数据

原因:
1. 随机数发生器本身初始化时间,
2.需要频繁的读取数据库

[ Last edited by jametong on 2004-7-15 at 15:16 ]

TOP

jonathan lewis 的一片关于随机抽取数据的帖子
附件: 您所在的用户组无法下载或查看附件

TOP

玉面飞龙正解,我试出来了

TOP

本人水平有限,看不懂!

TOP

select * from table_name sample(5);

sample(xxx)
xxx是百分比,5代表5%
每次都是随机的,不过连个数都随机,呵呵,
我在有1231533条记录的表里运行
SQL> select * from pol_info sample(0.0001);
试了5次,
返回的记录数分别是
4
5
0
2
4
呵呵
如果必须要50条,可以把百分比加大一点,like this

select * from (select * from table_name sample(7)) where rownum <51;

结果是随机的。

TOP

TOP

TOP

5楼说得很对阿

TOP

发新话题