oracle 分组前几条记录,Oracle分组后显示每组的前几条记录

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() 是一样的。(参考)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值