如何不使用rownum获取带rank的前两条学生记录?
获取带排名的前两条记录(不使用rownum)
问题背景
现有学生表student_info,执行以下SQL可得到包含分数排名的结果集:
SELECT student_info.student_name, student_info.department, student_info.marks, rank() over (order by student_info.marks desc) score FROM student_info ;
需在不使用rownum的前提下,获取该结果集中带排名的前两条记录。
解决方案
方案1:通过子查询筛选排名值
如果需要获取所有排名≤2的记录(包含分数并列的情况),可以将原查询作为派生表,再过滤排名条件:
SELECT * FROM ( SELECT student_info.student_name, student_info.department, student_info.marks, rank() over (order by student_info.marks desc) score FROM student_info ) ranked_students WHERE score <= 2;
方案2:使用FETCH FIRST子句(适用于Oracle 12c+、PostgreSQL等支持SQL:2008的数据库)
如果需要严格返回排序后的前2行记录(每条记录保留对应的rank值),可直接使用FETCH FIRST子句:
SELECT student_info.student_name, student_info.department, student_info.marks, rank() over (order by student_info.marks desc) score FROM student_info ORDER BY marks desc FETCH FIRST 2 ROWS ONLY;
内容的提问来源于stack exchange,提问作者Indrakumar IndraKUMAR
相关产品推荐
相关产品推荐

