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-我想使用此分析函数将产生最佳的执行计划,但在性能方面,总是如此,你需要自己测试,确保你有合适的索引。