189 8069 5689

oracle如何随机组行,oracle 随机

在oracle中,如何从一张表中查询一条随机记录

这几天工作上的需要,要从一个比较大的表中随机取出一条记录,oracle 不像MS SQLSERVER那样,直接用Select TOP 1 * From TABLE Order By NewID(),就能高效的随机查出一条记录。经过一翻折腾,用一个有90万条记录的表t_id,只有一个gameid字段,该字段上没有索引,表里就是从100000到999999一连串的数据记录,进行测试:

创新互联不只是一家网站建设的网络公司;我们对营销、技术、服务都有自己独特见解,公司采取“创意+综合+营销”一体化的方式为您提供更专业的服务!我们经历的每一步也许不一定是最完美的,但每一步都有值得深思的意义。我们珍视每一份信任,关注我们的网站建设、成都做网站质量和服务品质,在得到用户满意的同时,也能得到同行业的专业认可,能够为行业创新发展助力。未来将继续专注于技术创新,服务升级,满足企业一站式网络营销推广需求,让再小的品牌网站制作也能产生价值!

方法1.

采用rownum和dbms_random.value,平均用时5秒,这个效率确实是太低了,对于小表应该还行,大表那就太不适合了。

declare

n_id number(6);

begin

SELECT gameid into n_id FROM(SELECT gameid FROM t_id T ORDER BY dbms_random.value()) WHERE ROWNUM=1;

dbms_output.put_line(to_char(n_id));

end;

/

方法2. 

采用oracle sample语法,设置随机样本是1%,结果用时0.01左右,速度是相当快的,但是根据官网的说法,采用sample采集特性可能会产生不准确的结果集,我在测试中是没有碰到不正确的结果。但是有个问题,就是随机的结果分布很不平均,结果几乎都分内存卡在100000-200000的记录中。效率虽好,但并没有达到很好的随机效果,如果对于结果的要求不是很高的,这个方法是相当不错的。

declare

n_id number(6);

begin

SELECT gameid into n_id FROM t_id SAMPLE (1) WHERE ROWNUM = 1;

dbms_output.put_line(to_char(n_id));

end;

/

方法3. 

采用minus语法,先随机获取一个在表总记录数范围内的一个随机数,再通过rownum查询两个结果集只相差一条记录,用minus相减留出事先随机数的那条记录,平均用时大概1秒,随机数越小,查询速度越快,当随机数是20000时,用于0.016秒。该方法虽然

能得到很有随机效果,但效率比较不上该方法2. 对效率要求一般的话, 还是可以考虑使用的。

declare

n_count int:=0;

n_rand_num int:=0;

n_id number(6);

begin

SELECT COUNT(*) INTO n_count FROM t_id;

SELECT trunc(dbms_random.value(1,n_count+1)) INTO n_rand_num FROM DUAL;

select gameid into n_id from (SELECT gameid FROM t_id T WHERE rownumn_rand_num

minus

SELECT gameid FROM t_id T WHERE rownumn_rand_num-1);

dbms_output.put_line(to_char(n_id));

end;

/

求教ORACLE大牛,怎么从分组中每组随机取出特定数目的记录

可以直接使用 Oracle 的 ROWNUM 伪列来处理。

或者 使用 ROW_NUMBER() OVER ( ORDER BY class ) 的分析函数来处理。

参考资料中,是关于 排名或顺序的函数 ROW_NUMBER/RANK/DENSE_RANK/NTILE 使用的例子。 SQL Server 与 Oracle 都可以用的。

Oracle 按行数分组怎么处理

不用下跪,我来挽救你。

select trunc((rownum - 1)/10)+1 as groups,max(field1),min(field1),avg(field1) from y61 group by trunc((rownum - 1)/10)+1 order by groups;

oracle中随机抽取几组数据

方法有很多种,这里提供一例供参考:

select * from (select * from scott.emp order by dbms_random.random) where rownum11;

如何随机抽取oracle表中的记录

1楼瞎扯,你那个不是随机100行,每次运行的结果都是一样的;而且你用rank也不对,假如出现并列第100名,你那个返回的就不是100行了,应该用row_number

真正要随机应该这样写:

select * from

(select sale_id,user_id,row_number() over (partition by sale_id order by rnv) rn

from

(select sale_id,user_id,dbms_random.value() rnv from table1

where fee=5000 and sms_fee0 and gprs_cmwap_fee0 and statis_month=201003)

)

where rn=100

order by sale_id,user_id;

oracle中根据条件取随机N行

SELECT * FROM (

SELECT A,B,ROW_NUMBER() OVER(partition by A order by A desc) as RN

FROM TABLE

ORDER BY A,B

) WHERE RN5


分享文章:oracle如何随机组行,oracle 随机
URL地址:http://cdxtjz.cn/article/dssdhgh.html

其他资讯