Sql Server:包含不属于聚合函数或Group by子句的列

时间:2013-02-25 05:19:14

标签: sql sql-server select group-by

我有一个包含以下列的StudentGrades表:

 StudentID | CourseID | Grade

我需要为每门课程找到最优秀的学生(以及课程编号和课程的成绩。例如,如果学校总共有三门课程,则应该返回查询:

1111  3  93
2334  4  90
4343  6  100

这是我到目前为止所拥有的。以下查询

select CourseID, MAX(Grade) Grade 
from StudentGrades group by CourseID;

制作:

3   83
4   90
6   100

包含studentID列的最佳方法是什么?我知道我可以在临时表中保存上述结果并加入原始StudentGrades表,其中CourseID和Score匹配得到正确的列。是否有其他方式或更好的方式来包含StudentID?

希望这是有道理的。

谢谢!

1 个答案:

答案 0 :(得分:3)

SQL Server具有窗口函数功能。

WITH gradeList
AS
(
    SELECT  StudentID,
            CourseID, 
            Grade,
            DENSE_RANK() OVER (PARTITION BY CourseID
                                ORDER BY Grade DESC) RN
    FROM    tableName
)
SELECT  StudentID,
        CourseID, 
        Grade
FROM    gradeList
WHERE   rn = 1