SQL:为每个用户选择TOP N标记(在用户列表中)

时间:2009-02-25 18:42:18

标签: asp.net sql sql-server stored-procedures

我在编写存储过程时遇到困难,该存储过程将使用关联标记查询学生列表。

检索学生名单 - 琐碎 检索每个学生的前五个分数 - 琐碎... SELECT TOP(5)* WHERE StudentID = X

结合这两个,我有点困惑。

我希望存储过程返回两个表:

  • 第一个按标准列出学生的表格
  • 第二张表:成绩列表(第一张表中每位学生各5人)

第二张表是棘手的。我可以在First Table中获得每位学生的所有分数,但不确定如何将其限制在前5名。

2 个答案:

答案 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