【问题标题】:How do I grab each student’s 3rd max assignment mark in each subject如何获取每个学生在每个科目中的第三个最大作业分数
【发布时间】:2020-07-20 07:23:03
【问题描述】:

我正在尝试编写一个 sql,让我可以选择每个学生在每个科目中的第三个最佳作业分数。我已尝试使用下面的查询,但它对我不起作用。我会很感激能得到一些答案。我收到一个错误[Code: 0, SQL State: 21000] ERROR: more than one row returned by a subquery used as an expression。 这是表结构 Students , Courses(Id) ,名为 StudentsCourses(ID, StudentID,CourseID) 的桥接表,然后是包含 StudentsCourse(FK) 和 Grade 的作业表

select max(Assignments.Grade)
from Assignments
where grade < (select max(Assignments.Grade)
         from Assignments
         where grade  <  (select max(Assignments.Grade)
                         from Assignments
                         group by Assignments.StudentCourseID))

【问题讨论】:

    标签: sql postgresql greatest-n-per-group


    【解决方案1】:

    你可以使用窗口函数:

    select *
    from (
        select a.*, row_number() over(partition by student_id, subject_id order by grade desc)
        from assignments a
    ) a
    where rn = 3
    

    您的问题对assignments 表的结构有点不清楚。这假设学生由student_id 标识,主题由subject_id 标识 - 您需要根据您的实际列名进行调整。

    【讨论】:

    • 这是表结构 Students 、 Courses(Id) 、名为 StudentsCourses(ID, StudentID,CourseID) 的桥接表,然后是包含 StudentsCourse(FK) 和 Grade 的作业表
    • @Ekaku509:请不要将其他信息放入 cmets。 edit 而不是
    【解决方案2】:

    使用row_number():

    select a.*
    from (select a.*,
                 row_number() over (partition by student_id, StudentCourseID order by grade desc) as seqnum
          from assignments a
         ) a
    where seqnum = 3;
    

    注意:如果所有分配的值都相同,这将返回最大值。

    如果您想要第三高的不同分数,请使用dense_rank() 而不是row_number()

    【讨论】:

    • 这是表结构 Students 、 Courses(Id) 、名为 StudentsCourse(ID, StudentID,CourseID) 的桥接表,然后是包含 StudentsCourse(FK) 和 Grade 的作业表。你能解释一下row_number和dense_rank的使用吗
    • @Ekaku509 。 . .你的评论很好,但你的问题只引用了assignments,所以这就是这个答案所要解决的问题。您可以阅读 Postgres 的文档以更好地了解 Postgres 函数。
    • 是的,我实际上正在研究如何使用学生姓名,以及我提到的表格中的课程名称广告。我如何与分配表一起做到这一点?包含表非常感谢。我可能有另一个关于另一个问题的问题,所以我会得到一些关于该查询的答案
    • **这能找到我吗:每个班级的平均最终成绩(假设每个学生只计算前四项作业,如果学生少于四项作业假设分数为零剩下的?** select * from ( select s.*, a.grade, row_number() over(partition by s.studentID,s.courseID order by grade desc) as rn from assignments a, StudentCourses s where a.StudentCourseID = s.StudentCourseID ) a where rn &lt; 5]
    猜你喜欢
    • 2022-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    • 2022-11-24
    • 1970-01-01
    • 2021-04-18
    相关资源
    最近更新 更多