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

如题所述

逻辑很简单,但是看下解析之后还是很明白的。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) --成绩select * from ( select e.classid, e.userid, e.examid, e.result, row_number() over (partition by e.examid order by e.examid, e.result desc) rn from exam_result e where e.examid in (1,2,3) ) where rn <= 3row_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() 是一样的。(参考)
温馨提示:答案为网友推荐,仅供参考