2012-05-18 46 views
-1

我的表:選擇的第n個最高分

create table marks(stdName nvarchar(30), marks float) 
insert into marks 
select 'std1', 98 
union all select 'std2', 96 
union all select 'std3', 95 
union all select 'std4', 97 
union all select 'std5', 93 

我想創建一個存儲過程第n個最高分作爲給定的輸入parameter.suppose選擇該行,如果輸入的參數爲3,它應該顯示 'STD2',96或如果 輸入參數是5,它應該顯示 'STD5',93

+0

你能解釋一下_「'th'最高分數」嗎?我不明白你想要的結果的規則。 –

+0

th表示第一,第二,第三,第四,第五,第六......請看我提供的最後一句話作爲我的要求。 – nischal

回答

0

可以使用cteROW_NUMBER功能:

WITH cte AS(
    SELECT stdName 
    ,  marks 
    ,  ROW_NUMBER()OVER(ORDER BY marks DESC)As MarkRank 
    from marks 
) 
SELECT stdName, marks 
FROM cte 
WHERE MarkRank = @rank 
+0

謝謝Tim Schmelter的回覆。將U PLZ解釋我的行「ROW_NUMBER()OVER(ORDER BY標記DESC)由於MarkRank」 – nischal

+0

當我運行代碼時我得到一個錯誤'必須聲明標量變量'@rank''&如何編寫這個存儲過程CTE – nischal

-1

我已經解決了這個問題。感謝蒂姆的幫助。我有點困惑與存儲過程。

create procedure showmarks 
(@rank int) 
as 
    begin 

WITH cte AS(
    SELECT stdName 
    ,  marks 
    ,  ROW_NUMBER()OVER(ORDER BY marks DESC)As MarkRank 
    from marks 
) 
SELECT stdName, marks 
FROM cte 
WHERE MarkRank = @rank 
end 
+0

合適的方式是[接受](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)和/或提出答案,而不是將其發佈爲自己的回答。 –

+0

@ Tim Schmelter,沒有人問我寫存儲過程的方式和U離開它。你的回答讓我感到困惑。我也評論過你的回覆。任何方式感謝您的答覆。 – nischal