Как получить двух лучших студентов каждого профессора по SQL? - PullRequest
2 голосов
/ 26 марта 2009

У меня есть таблица с 3 полями, как это:

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

Я пробовал некоторые решения, но они не работают верно .

Как я могу сделать это правильно?

Ответы [ 4 ]

3 голосов
/ 26 марта 2009
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 голосов
/ 26 марта 2009

Я только что проснулся ... но вот идет:

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

Должно работать ... в основном вы запрашиваете профессоров и считаете их подзапросом, а затем выбираете тех, у кого есть 2 студента из этого подзапроса. Для их учеников вы должны ОБЪЕДИНИТЬ их и найти тех же профессоров, но ORDER BY достаточно хорош, чтобы получить двух лучших учеников.

0 голосов
/ 26 марта 2009

Если вы хотите это в SQL 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 голосов
/ 26 марта 2009
SELECT ProfessorID, StudentID, MAX(Mark)
FROM table
GROUP BY ProfessorID, StudentID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...