我在编写存储过程时遇到困难,该存储过程将使用关联标记查询学生列表。
检索学生名单 - 琐碎 检索每个学生的前五个分数 - 琐碎... SELECT TOP(5)* WHERE StudentID = X
结合这两个,我有点困惑。
我希望存储过程返回两个表:
第二张表是棘手的。我可以在First Table中获得每位学生的所有分数,但不确定如何将其限制在前5名。
答案 0 :(得分:1)
尽量避免返回2个结果集的存储过程。做两个单独的程序。
如果您未指定排序顺序,则TOP 5会返回随机行。我假设你想按年级排序。如果最高等级都相同,您将需要一些额外的排序顺序标准。例如,你可以返回最近的前五个等级。
对于每个学生返回前5个成绩的第2个程序,请查看RANK子句的语法。
答案 1 :(得分: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