Sql 使用MAX选择连接值的行

Sql 使用MAX选择连接值的行,sql,tsql,join,max,Sql,Tsql,Join,Max,考虑以下模式 学生: StudentID uniqueidentifier Name varchar(max) FKTeacherID uniqueidentifier 测试分数: TestScoreID uniqueidentifier Score int FKStudentID uniqueidentifier 我的目标是编写一个查询,生成每位教师的最高考试分数以及获得该分数的学生。返回教师id Student.FKTeacherID、达到TestScore.score的分数以及达到Te

考虑以下模式

学生:

StudentID uniqueidentifier
Name varchar(max)
FKTeacherID uniqueidentifier
测试分数:

TestScoreID uniqueidentifier
Score int
FKStudentID uniqueidentifier
我的目标是编写一个查询,生成每位教师的最高考试分数以及获得该分数的学生。返回教师id Student.FKTeacherID、达到TestScore.score的分数以及达到TestScore.score的学生Student.Name

我可以这样写来获得前两个必需的列:

SELECT FKTeacherID, MAX(Score) MaxScore
FROM Student
JOIN TestScore on FKStudentID = StudentID
GROUP BY FKTeacherID
但是,如果不将相关的Student.Name添加到group by子句中,我将无法获取它,这将更改结果集。

更新

如果可能,请尝试更新的查询:

SELECT 
    FKTeacherID, Name, Score
FROM 
    Student
    JOIN TestScore on FKStudentID = StudentID
    JOIN
    (
        SELECT 
            B.FKTeacherID AS TeacherID, MAX(A.Score) MaxScore 
        FROM 
            Student B
            JOIN TestScore A on A.FKStudentID = B.StudentID
        GROUP BY    
            B.FKTeacherID
    ) As TeachersMaxScore
    ON TeachersMaxScore.TeacherID = FKTeacherID 
       AND TeachersMaxScore.MaxScore = Score

如果我理解正确,一个选项是使用row_number-下面是一个具有通用表表达式的示例:

with cte as (
    select s.fkteacherid,
        ts.score,
        s.name,
        row_number() over (partition by s.fkteacherid order by ts.score desc) rn
    from student s
        inner join testscore ts on s.studentid = ts.fkstudentid
)
select fkteacherid, score, name
from cte
where rn = 1

基本思想是按FKTacherId分组,按每组内的分数描述排序,并从每组中获取第一条记录。

子查询选择MAXA。TestScore A中的score MaxScore只返回一条记录;所有TestScore记录的最大分数。我需要每个教师的每个最高分数这可能会返回重复的FKTacherId值,这违反了我的要求谢谢,它满足了功能要求。唯一的问题是cte计算每个记录的行号,即使我们排序所依据的列已被索引。从理论上讲,没有必要这样做来确定结果,我想知道是否有一种方法可以强制SQL计算相同的结果集,但更有效…@PatrickM-我想使用此分析函数将产生最佳的执行计划,但在性能方面,总是如此,你需要自己测试,确保你有合适的索引。