Dict.CN 在线词典, 英语学习, 在线翻译

都市淘沙者

荔枝FM Everyone can be host

统计

留言簿(23)

积分与排名

优秀学习网站

友情连接

阅读排行榜

评论排行榜

随机抽取前N条记录的问题(zhuant)

[A]8i以上版本
select * from (select * from tablename order by sys_guid()) where rownum < N;
select * from (select * from tablename order by dbms_random.value) where rownum< N;
注:dbms_random包需要手工安装,位于$ORACLE_HOME/rdbms/admin/dbmsrand.sql
dbms_random.value(100,200)可以产生100到200范围的随机数

[Q]抽取从N行到M行的记录,如从20行到30行的记录
[A]select * from (select rownum id,t.* from table where ……  
and rownum <= 30) where id > 20;


[Q]怎么样实现分组取前N条记录
[A]8i以上版本,利用分析函数
如获取每个部门薪水前三名的员工或每个班成绩前三名的学生。
Select * from  
(select depno,ename,sal,row_number() over (partition by depno
     order by sal desc) rn  
from emp)
    where rn<=3

[Q]如何取得一列中第N大的值?
[A]select * from  
(select t.*,dense_rank() over (order by t2 desc) rank from t)  
where rank = [$N]


实例:


 1建立測試環境
 2create table 表(學生名稱 varchar(10),學生性別 varchar(10),年齡 int,所屬班級 varchar(10),分數 int)
 3insert 表 select '張三','',18,'三年一班',85
 4union all select '張四','',18,'三年一班',90
 5union all select '張五','',18,'三年一班',84
 6union all select '張六','',18,'三年一班',75
 7union all select '李三','',18,'三年二班',96
 8union all select '李四','',18,'三年二班',82
 9union all select '李五','',18,'三年二班',86
10union all select '李六','',18,'三年二班',74
11union all select '王一','',18,'四年一班',85
12union all select '王二','',18,'四年一班',86
13union all select '王三','',18,'四年一班',84
14union all select '王四','',18,'四年一班',75
15go
16select * from 表
17第一中方法
18select * from 表 a
19where 分數 in(
20    select top 3 分數 from 表 where 所屬班級=a.所屬班級
21    order by 分數 desc)
22
23

 1第二中方法
 2select * from 表 a
 3where 學生名稱 in(
 4    select top 3 學生名稱 from 表 where 所屬班級=a.所屬班級
 5    order by 分數 desc)
 6order by 所屬班級,分數 desc
 7
 8第三中方法
 9select
10    a.*
11from
12    表 a
13where
14    a.學生名稱 in (select top 3 學生名稱 from 表 where 所屬班級=a.所屬班級 order by 分數 desc)
15order by
16    a.所屬班級,a.分數 desc 
实例2:
 1create table 成绩
 2(
 3id  int identity,
 4班级 varchar(20),
 5姓名 varchar(20),
 6分数 int
 7)
 8insert into 成绩(班级,姓名,分数)values('1','aa',89)
 9insert into 成绩(班级,姓名,分数)values('1','bb',45)
10insert into 成绩(班级,姓名,分数)values('1','cc',65)
11insert into 成绩(班级,姓名,分数)values('1','dd',67)
12insert into 成绩(班级,姓名,分数)values('1','ff',23)
13insert into 成绩(班级,姓名,分数)values('1','aeea',76)
14insert into 成绩(班级,姓名,分数)values('1','sfdsad',26)
15
16insert into 成绩(班级,姓名,分数)values('2','afdsf',34)
17insert into 成绩(班级,姓名,分数)values('2','dsf',75)
18insert into 成绩(班级,姓名,分数)values('2','fdfdg',23)
19insert into 成绩(班级,姓名,分数)values('2','dfg',74)
20insert into 成绩(班级,姓名,分数)values('2','sdf',23)
21insert into 成绩(班级,姓名,分数)values('2','sdf',56)
22insert into 成绩(班级,姓名,分数)values('2','jhj',74)
23
24
25select * from 成绩 a where (select count(*from 成绩 b where a.班级 = b.班级 and a.分数<= b.分数)<=3 order by 班级,分数 desc


1/*实例四:语句中的30,31,40,58表示不同类型的数据,如:新闻,音乐,小说等类型,查询语句的具体条件就是:
从4个不同模块中各取最新的前10条记录(不够10条则取全部数据)总共不超过40条记录来随机取4条,注意其中有可能4条都是同个类型,如果要限制每样都要有一条,则可以对限制条件做处理即可
*/

2
3
select id,module_id,title,msg,obj1,obj2,obj3,obj5,add_date from (
4                select * from mxt_msginfo a  where (
5                     select count(*from mxt_msginfo b  where  a.module_id = b.module_id and a.add_date<= b.add_date )<=10 and a.module_id in (30,31,40,58)   
6                     order by dbms_random.value 
7            )  where rownum<5  

posted on 2007-12-04 21:30 都市淘沙者 阅读(381) 评论(0)  编辑  收藏 所属分类: Oracle/Mysql/Postgres/


只有注册用户登录后才能发表评论。


网站导航: