【问题标题】:SQL: Select TOP N Marks Per User (In a List of Users)SQL:选择每个用户的前 N ​​个标记(在用户列表中)
【发布时间】:2010-10-09 21:25:46
【问题描述】:

我很难编写一个存储过程来查询学生列表及其关联标记。

检索学生列表 - 琐碎 检索每个学生的前五名 - 微不足道...SELECT TOP (5) * WHERE StudentID = X

把这两个结合起来,我有点糊涂了。

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

  • 第一个按条件列出学生的表格
  • 第二张表:成绩列表(第一张表中每个学生各 5 个)

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

【问题讨论】:

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


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      尽量避免返回 2 个结果集的存储过程。制作这 2 个单独的程序。

      如果您未指定排序顺序,TOP 5 会返回随机行。我假设您想按年级排序。如果最高等级都相同,您将需要一些额外的排序标准。例如,您可以返回最近的前 5 个成绩。

      对于返回每个学生的前 5 个成绩的第二个过程,请查看 RANK 子句的语法。

      【讨论】:

      • 为什么我不能返回多个结果集?或者它应该是调用其他两个存储过程的存储过程......我只是想了解逻辑...... :)
      • A.因为,虽然它在技术上是可行的,但它有点不寻常,并且让正在查看您的代码的人难以理解。 B. 因为其他数据库(Orcale)做不到。
      猜你喜欢
      • 1970-01-01
      • 2011-11-23
      • 2023-02-23
      • 2023-03-17
      • 1970-01-01
      • 2017-07-31
      • 2011-09-13
      • 1970-01-01
      • 2023-03-29
      相关资源
      最近更新 更多