2013-05-03 82 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