2009-02-25 61 views
1

我很難編寫一個存儲過程來查詢帶有關聯標記的學生列表。SQL:選擇前N個用戶標記(在用戶列表中)

檢索的學生名單 - 平凡 檢索每個學生的五大標記 - 平凡... SELECT TOP(5)* WHERE StudentID = X

結合這兩個,我有點糊塗了。

我想存儲過程返回兩個表:

  • 第一個表,通過一個標準列出了學生
  • 二表:等級(第一個表5各每位學生)的列表

第二個表是棘手的時候。我可以在第一張表中獲得每個學生的所有分數,但不知道如何將其限制在前5位。

回答

1

如果您使用SQL 2005或更高版本,這應該工作。如果沒有,還有其他稍微混亂的方法來做到這一點。

WITH Student_Grades AS 
(
    SELECT 
     S.student_id, 
     G.grade, 
     RANK() OVER (PARTITION BY S.student_id, ORDER BY G.exam_date DESC) AS grade_rank 
    FROM 
     Students S 
    LEFT OUTER JOIN Grades G ON 
     G.student_id = S.student_id 
) 
SELECT 
    student_id, 
    grade 
FROM 
    Student_Grades 
WHERE 
    grade_rank <= 5 
1

儘量避免存儲過程返回2個結果集。做這2個獨立的程序。

如果您未指定排序順序,則TOP 5將返回隨機行。我假設你想按年級排序。如果最高成績完全相同,您將需要一些額外的排序順序標準。例如,您可以返回最近的前五名。

爲了讓您的第二個程序返回每個學生的前5個成績,請查看RANK子句的語法。

+0

爲什麼我不應該返回多個結果集? 或者它應該像一個存儲Proc那樣調用另外兩個存儲過程...我只是想了解邏輯.. :) – TimLeung 2009-02-25 20:04:05

相關問題