SQL 根据最大​​列获取行

Posted

技术标签:

【中文标题】SQL 根据最大​​列获取行【英文标题】:SQL Get rows based on max column 【发布时间】:2013-03-18 18:14:15 【问题描述】:

我在从最大列中获取行时遇到问题, 这里是插图:http://sqlfiddle.com/#!3/15207/9

基本上我想获得学生的最高成绩以及成绩ID(gid)。但查询不正确,因为使用了 maxgrade id,它将返回 2。

第一门课,学生得了 D(1 分)。 第二次参加课程,学生获得 E(0 分)。

该 1 分的等级 ID 为 1。

我希望查询结果是:1(userid),1(subjectid),1(gradeid),1(score)

谢谢

更新 01:

更完善的例子:http://sqlfiddle.com/#!3/97997/2

【问题讨论】:

【参考方案1】:

更新 1

WITH highestScore
AS
(
    SELECT  a.uid StudentID,
            a.uname StudentName,
            b.Score, 
            c.cname CourseName,
            c.semester,
            d.sname SubjectName, d.sid, 
            DENSE_RANK() OVER (PARTITION BY a.uid, d.sid
                               ORDER BY b.Score DESC) rn
    FROM    Users a
            INNER JOIN Grades b
                ON a.uid = b.uid
            INNER JOIN Courses c
                ON b.cid = c.cid
            INNER JOIN Subjects d
                ON c.sid = d.sid
)
SELECT  StudentID, StudentName, CourseName, semester,
        SubjectName, Score
FROM    highestScore
WHERE   StudentID = 1 AND  -- StudentID
        sid = 1 AND        -- SubjectID
        RN = 1             -- leave this as is (rank of the highest score)
SQLFiddle Demo

【讨论】:

在此示例中添加另一条记录时失败 sqlfiddle.com/#!3/97997/2 (预期结果为 1,1,1,1) 抱歉,我没有在前面的示例中添加更多行,因为学生将有许多不同的科目和课程 让我看看例子:D 查看我的更新答案。它使用common table expressionwindow function 查看我的更新答案,或者如果您对 ID 更感兴趣,请参阅此处sqlfiddle.com/#!3/97997/17

以上是关于SQL 根据最大​​列获取行的主要内容,如果未能解决你的问题,请参考以下文章

根据差异总和的最大值访问所有行。在开始时间和结束时间列之间

根据列中的一组查找最大值行并在熊猫中进行透视

根据两个文本列排序的 SQL 获取下一行和上一行

如何根据一列限制行数?

根据其他列 SQL 的最大值更新列 [重复]

如何根据创建标识符和最大日期的两列选择行