我很難編寫一個存儲過程來查詢帶有關聯標記的學生列表。SQL:選擇前N個用戶標記(在用戶列表中)
檢索的學生名單 - 平凡 檢索每個學生的五大標記 - 平凡... SELECT TOP(5)* WHERE StudentID = X
結合這兩個,我有點糊塗了。
我想存儲過程返回兩個表:
- 第一個表,通過一個標準列出了學生
- 二表:等級(第一個表5各每位學生)的列表
第二個表是棘手的時候。我可以在第一張表中獲得每個學生的所有分數,但不知道如何將其限制在前5位。
我很難編寫一個存儲過程來查詢帶有關聯標記的學生列表。SQL:選擇前N個用戶標記(在用戶列表中)
檢索的學生名單 - 平凡 檢索每個學生的五大標記 - 平凡... SELECT TOP(5)* WHERE StudentID = X
結合這兩個,我有點糊塗了。
我想存儲過程返回兩個表:
第二個表是棘手的時候。我可以在第一張表中獲得每個學生的所有分數,但不知道如何將其限制在前5位。
如果您使用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
儘量避免存儲過程返回2個結果集。做這2個獨立的程序。
如果您未指定排序順序,則TOP 5將返回隨機行。我假設你想按年級排序。如果最高成績完全相同,您將需要一些額外的排序順序標準。例如,您可以返回最近的前五名。
爲了讓您的第二個程序返回每個學生的前5個成績,請查看RANK子句的語法。
爲什麼我不應該返回多個結果集? 或者它應該像一個存儲Proc那樣調用另外兩個存儲過程...我只是想了解邏輯.. :) – TimLeung 2009-02-25 20:04:05