2013-05-03 81 views
2

说前N行,如果我有一个表下面列,甲骨文选择基于价值

Marks 
60 
80 
70 
90 
95 
90 
70 

我需要在顶部4,选择所有带有标记的行,即。在这种情况下,应该返回> = 70和6行。

我不知道如何做到这一点,有人可以帮忙吗?谢谢。

+0

这个网站上已经有很多这个问题的变种。 – Lion 2013-05-03 15:10:21

+0

加上这个非常有趣的网站。 http://www.oracle-base.com/articles/misc/top-n-queries.php – 2013-05-03 15:11:24

回答

3
SELECT Marks FROM (
    SELECT Marks, DENSE_RANK() OVER (ORDER BY Marks DESC) AS MarksRank 
    FROM yourtable 
) WHERE MarksRank <= 4 
+0

我相信你需要使用RANK()而不是DENSE_RANK(),因为你想要四个不同的Mark值,它们应该返回6示例中的行。 – tylert 2013-05-03 15:14:41

+2

@tylert使用'RANK()'只会给你4个记录在这种情况下。 – 2013-05-03 15:17:27

+2

准确地说 - 用'RANK()'这个等级将被分配如下:95 = 1,90 = 2,90 = 2,80 = 4,70 = 5等等。注意它是如何从90 = 2变成80 = 4:90并列第二,所以80下降到第四位。 'DENSE_RANK'将摆脱排名中的差距:95 = 1,90 = 2,90 = 2,80 = 3,70 = 4等。 – 2013-05-03 15:21:05