为每个班级找到大多数学生的家乡

时间:2014-08-14 19:49:53

标签: sql sql-server

我有三个表,ClassStudentStudentClassInfo。他们的关系如下所示。 ER Diagram

我想找到以下结果。

ClassID | ClassName | MostPopularHometown
   c01      CS101          NY
   c02      CS102          LA
   c02      CS102          CA

对于每个班级,我想找到该班级中大多数学生的家乡。例如,如果c01中有10名来自纽约州的学生,而来自任何其他单一州的学生少于10名,那么我们会有一排c01 CS101 NY。 如果有联系,请打印所有这些,例如示例中的最后两行。

我的进步:每节课,我都可以在家乡分组。喜欢以下。

select dbo.Class.ClassID, max(ClassName) as ClassName, Hometown, count(dbo.Student.StudentID) as NumOfStudents
from dbo.Student inner join dbo.ClassStudentInfo 
on dbo.Student.StudentID=dbo.ClassStudentInfo.StudentID
inner join dbo.Class
on dbo.Class.ClassID=dbo.ClassStudentInfo.ClassID
group by dbo.Class.ClassID, Hometown
order by dbo.Class.ClassID ASC, NumOfStudents DESC

输出就像,

enter image description here 我希望结果有1,2,3,5,6,7,8行。

1 个答案:

答案 0 :(得分:2)

您可以使用RANK功能根据分区为每行分配排名。遗憾的是,您不能在where子句中使用窗口函数,因此您必须在子查询中使用。然后,您可以从中进行选择并过滤排名列。

因此,根据您的查询:

SELECT
*
FROM
(
select
dbo.Class.ClassID,
max(ClassName) as ClassName,
Hometown,
count(dbo.Student.StudentID) as NumOfStudents,
RANK() OVER (PARTITION BY dbo.Class.ClassID order by count(dbo.Student.StudentID) DESC) as Ranked
from dbo.Student
inner join dbo.ClassStudentInfo on dbo.Student.StudentID=dbo.ClassStudentInfo.StudentID
inner join dbo.Class on dbo.Class.ClassID=dbo.ClassStudentInfo.ClassID
group by dbo.Class.ClassID, Hometown
) T
where 
t.ranked = 1