SQL Server查询问题:获取每个MGR_ID对应员工数最多的站点
正确SQL解决方案:获取每个经理对应员工数最多的站点
你的原查询问题在于,外层查询的分组逻辑和CTE完全一致,MAX(MgCnt)只是返回每个分组自身的员工计数,并没有筛选出每个MGR_ID下计数最大的站点,因此会返回所有分组行。
要实现“保留每个MGR_ID下员工数最多的站点,并列最大值全部保留”的需求,推荐使用**窗口函数RANK()**来完成筛选,具体SQL如下:
WITH cte_mgr AS ( SELECT MGR_ID, SITE, COUNT(*) AS MgCnt, -- 按MGR_ID分组,按员工数降序排名,并列最大值的站点排名相同 RANK() OVER(PARTITION BY MGR_ID ORDER BY COUNT(*) DESC) AS RankNum FROM #EMP e GROUP BY e.MGR_ID, e.SITE ) SELECT MGR_ID, SITE, MgCnt FROM cte_mgr WHERE RankNum = 1;
逻辑说明:
- 第一步CTE中,先按
MGR_ID和SITE分组,统计每个经理对应每个站点的员工数MgCnt。 - 同时用
RANK()窗口函数,对每个MGR_ID下的站点按员工数降序排名:员工数最多的站点排名为1,若有多个站点员工数相同且为最大值,它们的排名都会是1。 - 最后筛选出排名为1的行,就是每个经理下员工数最多的站点(含并列情况)。
如果需要处理更复杂的并列场景(比如存在多个层级的并列),也可以用DENSE_RANK()替代RANK(),二者在当前需求下效果一致。
内容的提问来源于stack exchange,提问作者SilverFish
相关产品推荐
相关产品推荐

