这样应该可以 select * (select rank() over(order by score) rank ,t1.* from t1) where rank < 4
忘了前3名应该是 order by score desc
select * (select rank() over(order by score desc) rank ,t1.* from t1) where rank < 7 结果: rank name score 1 a 100 2 b 99 2 c 99 2 d 99 5 e 98 6 f 97select * (select DENSE_RANK() over(order by score desc) rank ,t1.* from t1) where rank < 5 结果: rank name score 1 a 100 2 b 99 2 c 99 2 d 99 3 e 98 4 f 97
排名无重复SQL> select rid,ename,job,sal from ( 2 select ename,job,sal,row_number() over(order by sal desc) rid from emp 3 ) t 4 where t.rid<=3; RID ENAME JOB SAL ---------- ---------- --------- ---------- 1 KING PRESIDENT 5000 2 SCOTT ANALYST 3000 3 FORD ANALYST 3000SQL>
正确的办法应该是先获得rownum=3的成绩,然后把所有成绩大于这个成绩的都列出来才是正解
from t1
where grade > =( select grade
from (select grade
from t1 t
order by grade)
where rownow=3);
上边说的不太妥当,如果第三名的成绩有相同的多个人,那应该怎么样呢?
正确的办法应该是先获得rownum=3的成绩,然后把所有成绩大于这个成绩的都列出来才是正解情况1:前三名都是100fen,那么前三名就是前三名就是并列第一,也就是千三名。
情况2:第一名是100,第二三名都是98,那么第一名是100,并列2名,前三名都有了。
情况3:第一名100,第二名98,第三名95 第四名95 那么前三名应该是四个人,三名和四名并列第三。.................这种情况是上头最不爱看到的,发奖品超出了,呵呵。
select * (select rank() over(order by score) rank ,t1.* from t1) where rank < 4
结果:
rank name score
1 a 100
2 b 99
2 c 99
2 d 99
5 e 98
6 f 97select * (select DENSE_RANK() over(order by score desc) rank ,t1.* from t1) where rank < 5
结果:
rank name score
1 a 100
2 b 99
2 c 99
2 d 99
3 e 98
4 f 97
2 select ename,job,sal,row_number() over(order by sal desc) rid from emp
3 ) t
4 where t.rid<=3; RID ENAME JOB SAL
---------- ---------- --------- ----------
1 KING PRESIDENT 5000
2 SCOTT ANALYST 3000
3 FORD ANALYST 3000SQL>