我有这样的架构
create table sample(id number ,name varchar2(30),mark number);
现在我必须返回前三个标记的名称。我怎么能为此编写SQL查询?
如果我使用 max(标记),它将仅返回最大值和
select name from sample
返回所有名字!!我试过很多方法,但我无法将结果控制为3行.. 请建议摆脱我的问题的方法..
答案 0 :(得分:4)
你想如何处理关系?如果玛丽获得100分,那么汤姆得到95分,约翰和戴夫都得到90分,你想要的结果是什么?你想要约翰和戴夫都归还,因为他们并列第三?或者你想选择其中一个,以便结果总是有三行?如果Beth以95分排名并列第二,会发生什么?你还认为约翰和戴夫并列第三,还是你认为他们并列第四名?
您可以使用分析函数获得前N个结果,但您选择的分析函数取决于您希望如何解决关系。
SELECT id,
name,
mark
FROM (SELECT id,
name,
mark,
rank() over (order by mark desc) rnk
FROM sample)
WHERE rnk <= 3
将使用RANK
分析函数返回前三行,按MARK
对其进行排名。 RANK
为被绑定的人返回相同的排名,并使用标准体育方法来确定您的排名,这样如果两个人并列第二,则下一个竞争者排在第四位,而不是第三位。 DENSE_RANK
确保不跳过数字排名,这样如果两个人排在第二位,则下一行排在第三位。 ROW_NUMBER
通过任意破坏关系为每一行分配不同的等级。
如果你真的想使用ROWNUM
而不是分析函数,你也可以
SELECT id,
name,
mark
FROM (SELECT id,
name,
mark
FROM sample
ORDER BY mark DESC)
WHERE rownum <= 3
但是,由于谓词在排序之前应用,因此不能将ROWNUM
谓词与ORDER BY
子句放在同一级别。
答案 1 :(得分:0)
SELECT t2.name FROM
(
SELECT t.*, t.rownum rn
FROM sample t
ORDER BY mark DESC
) t2
WHERE t2.rn <=3