我可以选择每个部门的最高分数,但不能显示与最高分数相关的每个人的姓名。 我试图选择名称和最高等级(具有最高功能),但是它不起作用:
select max(stgrade)as highscore,StName,DepName --department
from TBL_DEPARTMANTS d
inner join TBL_LESSONS l on d.DepID=l.LessonID
inner join TBL_GRADES g on g.lessonid=l.LessonID
inner join TBL_STUDENT s on s.STID=g.stid
group by DepName,StName
order by DepName,highscore desc
答案 0 :(得分:1)
您可以尝试...
select * from ( select rank() over (partition by DepName order by stgrade desc) as Slno, stgrade, stname, DepName
from TBL_DEPARTMANTS d
inner join TBL_LESSONS l on d.DepID=l.LessonID
inner join TBL_GRADES g on g.lessonid=l.LessonID
inner join TBL_STUDENT s on s.STID=g.stid ) as dep where dep.slno=1
首先为各个部门按降序创建rank()
。然后选择相同的最高记录。
注意:使用RANK()
或DENSE_RANK()
,两者都适用于前1条记录,而如果您想选择n
最高成绩,则使用DENSE_RANK()
,在最后一次slno
通过n'th
您要选择的记录。
答案 1 :(得分:0)
选择理论总是很困难,但是,尽管DarkRob的解决方案很好,但如果例如两个人最好的话,它将淘汰学生。这就是为什么我喜欢使用交叉应用的原因:
select
d.Depname
, s.StName
, g.stgrade
from TBL_DEPARTMANTS d
inner join TBL_LESSONS l on
d.DepID=l.LessonID
inner join TBL_GRADES g on
g.lessonid=l.LessonID
inner join TBL_STUDENT s on
s.STID=g.stid
cross apply (
select
sub_d.DepID
, max(sub_g.stgrade) as maxgrade
from TBL_DEPARTMANTS sub_d
inner join TBL_LESSONS sub_l on
sub_d.DepID=sub_l.LessonID
inner join TBL_GRADES sub_g on
sub_g.lessonid=sub_l.LessonID
where sub_d.Dep_ID = d.Dep_ID
group by sub_d.DepID
) as sub
where g.stgrade = sub.maxgrade
这样,您将获得所有部门最高职位的员工,而不仅仅是一个。