我有三个表,Class
,Student
,StudentClassInfo
。他们的关系如下所示。
我想找到以下结果。
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
输出就像,
我希望结果有1,2,3,5,6,7,8行。
答案 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