Q1.如 表中记录是
code serialno
A1 1
A1 2
A1 3
A1 5
B1 2
B1 3
B1 4
我需要的结果是 表中 A1和B1的第2条记录. (转载于CSDN)
A1.select
a.code,a.serialno
from
(select code,serialno,rownum rid from 表) a,
(select code,serialno,rownum rid from 表) b
where
a.code=b.code and a.rid>=b.rid
group by
a.code,a.serialno
having count(*)=2
解析:对表中的记录利用rownum编号,然后利用两个子查询对同一条记录的编号相同的原理,统计code相同的记录存在几条编号小于等于当前编号的记录,如果 为2,则说明当前记录在表中对于相同的code是第二条记录,输出。逻辑很简单,但是看下解析之后还是很明白的。
Q2。在oracle中有一数据表exam_result(成绩记录表),
表中的一条记录描述了“某个班某个学生某次考试的成绩"
create table EXAM_RESULT
(
ID NUMBER(10) not null, --主键
CLASSID NUMBER(10) not null, -- 班级id,关联到班级表
USERID NUMBER(10) not null, --用户id,关联到用户表
EXAMID NUMBER(10) not null, --试卷id,关联到试卷表
RESULT NUMBER(3) --成绩
)
现在要求统计完成了试卷id为1,2,3的成绩的前3名
即完成了试卷id为1的前3名,完成了试卷id为2的前3名,完成了试卷id为3的前3名.(转载于CSDN).
A2.
select*from(
select
e.classid,
e.userid,
e.examid,
e.result,
row_number() over (partition bye.examidorderbye.examid, e.resultdesc) rn
fromexam_result e
wheree.examidin(1,2,3)
) wherern <= 3
row_number() over的函数是将按e.examid分组,再按e.examid降序排列。这两个字段当然可以不一样。。这个函数与nownum的功能差不多,区别在于:使用rownum进行排序的时候是先对结果集加入伪列rownum然后再进行排序,而此函数在包含排序从句后是先排序再计算行号码.
另外几下函数:
rank()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内).
dense_rank()l是连续排序,有两个第二名时仍然跟着第三名。相比之下row_number是没有重复值的 .
lag(arg1,arg2,arg3):
arg1是从其他行返回的表达式
arg2是希望检索的当前行分区的偏移量。是一个正的偏移量,时一个往回检索以前的行的数目。
arg3是在arg2表示的数目超出了分组的范围时返回的值。
使用的方法与row_number() 是一样的。(参考)