2009-03-26 1 views
2

내가이 추천 필드가있는 테이블이 있습니다 교수는 많은 학생들, 그리고 그 반대를 가르 칠 수SQL에서 각 교수의 최고 학생 2 명을 얻는 방법?

ProfessorID StudentID Mark 
P1    S1    9 
P1    S2    8 
P1    S3    10 
P2    S1    7 
P2    S2    2 
P2    S3    4 
P3    S4    5 
P4    S1    6 

을, 학생은 많은 교수로부터 배울 수 있습니다. 학생이 교수에게서 배울 때, 그는 그의 표를 얻는다.

내 문제는 적어도 2 명의 학생을 가르치는 교수 목록과 그 교수로부터 최고의 점수를 얻은 2 명의 학생입니다. 예를 들어,이 테이블의 쿼리 결과는 다음과 같습니다

ProfessorID StudentID Mark 
P1    S1    9 
P1    S3    10 
P2    S1    7 
P2    S3    4 

나는 몇 가지 솔루션을 시도했지만 그들은 바로를 작동하지 않습니다.

어떻게하면 제대로 할 수 있습니까?

+0

숙제로 태그를 추가했는데 시도한 것을 게시하면 올바른 방향으로 향하게됩니다. – Martin

답변

3
declare @table table (ProfessorID nvarchar(2), StudentID nvarchar(2),Mark int) 

insert into @table 
select 'P1', 'S1', 9 
union all 
select 'P1', 'S2', 8 
union all 
select 'P1', 'S3', 10 
union all 
select 'P2', 'S1', 7 
union all 
select 'P2', 'S2', 2 
union all 
select 'P2', 'S3', 4 
union all 
select 'P3', 'S4', 5 
union all 
select 'P4', 'S1', 6 

select * 
from @table o 
where o.StudentID IN (select top 2 s.StudentID from @table s where s.ProfessorId = o.ProfessorId order by Mark DESC) 
and o.ProfessorID IN (select p.ProfessorID from @table p group by p.ProfessorID having count(*) >= 2)
+0

재미있는 ... 내가 더 깨어 났을 때 다시보아야 할 것이다. – CodeRedick

-1
SELECT ProfessorID, StudentID, MAX(Mark) 
FROM table 
GROUP BY ProfessorID, StudentID 
+0

두 명 이상의 학생과 함께 교수가 제한하지 않으며 상위 2 점까지만 제한하지 않습니다. – cmsjr

+0

:) 이건 그냥 제대로 작동하지 않습니다 – Vimvq1987

+0

내 나쁜 ... 너무 빨리 질문을 읽어보십시오. – atfergs

0

간다 2005 (또는 2008),이뿐만 아니라 그냥 깨어

select * 
from 
(
select * 
    ,rank() over (partition by professorid order by mark desc) as ranking 
    ,(select count(distinct studentid) 
     from marks m2 
     where m2.professorid = m1.professorid 
     group by professorid 
     ) as students 
from marks m1 
) subs 
where ranking < 3 
and students > 2 

-Edoode

0

작동 SQL에서 당신이 원하는 Asuming ...하지만 :

select * 
FROM 
    (select professorID, count(distinct studentID) as studentsTaught 
    FROM table 
    ) s 
WHERE s.studentsTaught = 2 
UNION ALL  
SELECT top 2 * 
FROM table 
WHERE professorID IN (select professorID 
         FROM (
          select professorID, count(distinct studentID) as studentsTaught 
          FROM table 
          ) s 
        ) 
WHERE s.studentsTaught = 2 
ORDER BY mark 

작동해야합니다. 기본적으로 pr을 쿼리하고 있습니다. 하위 쿼리로 계산 한 다음 해당 하위 쿼리에서 2 명의 학생이있는 하위 클래스를 선택합니다. 학생들에게 UNION을하고 같은 교수를 찾아야하지만, ORDER BY는 두 명의 최고 학생을 확보 할만큼 충분히 좋습니다.

+0

해당 쿼리에 공용체가 필요하지 않은지 확실하지 않습니다. – Martin

+0

그것이 내가했던 방식입니다 ...;) – CodeRedick

관련 문제