控制oracle查询的结果

时间:2012-01-04 18:43:23

标签: sql oracle10g

我有这样的架构

 create table sample(id number ,name varchar2(30),mark number);

现在我必须返回前三个标记的名称。我怎么能为此编写SQL查询?

如果我使用 max(标记),它将仅返回最大值和

  select name from sample 

返回所有名字!!我试过很多方法,但我无法将结果控制为3行.. 请建议摆脱我的问题的方法..

2 个答案:

答案 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