如何在子查询中使用COUNT函数?获取招生量最多的部门Reshnum的SQL实现求助
解决仅输出招生量最多部门的ReshNum问题
嘿,你的初始思路其实已经走对方向了,只需要小调整就能达到目标,另外我也给你几种不同场景下的解决方案:
方案1:直接修改原SQL(最简单)
你原来的语句只是多输出了招生数量,只需要把count(*) as Number_of_Adm从select里去掉,把统计逻辑移到order by里就行,还要注意加desc(不然默认升序会拿到招生最少的部门):
select top 1 Department.ReshNum from Admission inner join Department on Admission.DepartmentId = Department.id group by Department.ReshNum order by count(*) desc;
这个方法和你的初始逻辑完全一致,只是聚焦在你需要的ReshNum字段上,排序逻辑保留,最终只返回招生量最高的那个部门编号。
方案2:子查询匹配最大招生数(支持并列场景)
如果存在多个部门招生量并列第一的情况,上面的top 1只会返回其中一个,用这个方法可以把所有并列第一的部门都找出来:
select d.ReshNum from Department d join ( -- 先统计每个部门的招生数量 select DepartmentId, count(*) as adm_count from Admission group by DepartmentId ) a on d.id = a.DepartmentId -- 匹配招生数量等于最大值的部门 where a.adm_count = ( select max(adm_count) from ( select count(*) as adm_count from Admission group by DepartmentId ) t );
方案3:窗口函数(更灵活的现代写法)
如果你的数据库支持窗口函数(比如SQL Server、PostgreSQL、MySQL 8.0+等),用rank()函数可以更优雅地处理并列场景:
select ReshNum from ( select d.ReshNum, -- 按招生数降序排名,最多的排第1 rank() over(order by count(*) desc) as adm_rank from Admission a join Department d on a.DepartmentId = d.id group by d.ReshNum ) t where adm_rank = 1;
这里rank()会给所有招生量并列第一的部门都标记为1,所以最终会返回所有符合条件的ReshNum,逻辑更清晰易读。
另外提醒一下:你原来的SQL里order by Number_of_Adm没有加desc,默认是升序排序,会返回招生量最少的部门,一定要加上desc才能拿到最多的那个哦!
内容的提问来源于stack exchange,提问作者Beefybanana
相关产品推荐
相关产品推荐

