MAX

2014-12-31 5 views
0

을 사용하여 조인 된 값의 행 선택 다음 스키마를 고려하십시오.MAX

학생 :

StudentID uniqueidentifier 
Name varchar(max) 
FKTeacherID uniqueidentifier 

TestScore :

TestScoreID uniqueidentifier 
Score int 
FKStudentID uniqueidentifier 

내 목표는 각 교사의 가장 높은 시험 점수를 달성 한 학생을 산출하는 쿼리를 작성하는 것입니다. 교사의 ID (Student.FKTeacherID)를 얻었을 때 얻은 점수 (TestScore.Score)와 그것을 성취 한 학생 (Student.Name).

내가 처음이 필요한 열을 얻기 위해 다음처럼 작성할 수 있습니다

SELECT FKTeacherID, MAX(Score) MaxScore 
FROM Student 
JOIN TestScore on FKStudentID = StudentID 
GROUP BY FKTeacherID 

을하지만 결과를 바꿀 것이다, GROUP BY 절에 추가하지 않고 관련 Student.Name를 얻을 수 없습니다 세트. - 여기에 공통 테이블 예입니다

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 

답변

0

UPDATE는

업데이트 쿼리를 시도하십시오 -expression :

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 

기본적인 아이디어는에 의해 주문, fkteacherid에 의해 그룹입니다 각 그룹 내에서을 검색하고 각 그룹에서 첫 번째 레코드를 가져옵니다.

+0

하위 쿼리'SELECT MAX (A.Score) MaxScore FROM TestScore A'는 하나의 레코드 만 반환합니다. 모든 TestScore 레코드의 최대 점수. 각 최대 점수 필요 교사 당 점수 –

+0

내 요구 사항을 위반하는 중복 FKTeacherID 값을 반환 할 수 있습니다. –

2

내가 제대로 이해 해요 경우, 하나의 옵션이 row_number()을 사용하는 것입니다 : 당신이 수도 경우

+0

감사합니다. 기능적 요구 사항을 충족합니다. 문제는 단지 우리가 주문한 열이 색인 된 경우에도 cte가 모든 레코드의 행 번호를 평가한다는 것입니다. 이론적으로 결과를 결정하기 위해이 작업을 수행 할 필요는 없습니다. SQL이 동일한 결과 집합을 평가하지만 더 효율적으로 평가하는 방법이 있는지 궁금합니다. –

+0

@PatrickM -이 분석 함수를 사용하면 최선의 실행 계획을 세우지 만 성과와 관련하여 언제나 그렇듯이 스스로 테스트해야합니다 (적절한 인덱스가 있는지 확인해야합니다). – sgeddes