SQL Server中如何筛选临时表中计数最高的OBJECT_FK?
在SQL Server中获取计数最高的OBJECT_FK
方法1:使用DENSE_RANK()窗口函数(推荐)
这种方法能直接筛选出所有计数并列最高的记录,代码简洁高效:
WITH RankedObjects AS ( SELECT OBJECT_FK, COUNT(OBJECT_FK) AS totalCount, DENSE_RANK() OVER (ORDER BY COUNT(OBJECT_FK) DESC) AS rnk FROM #TempTable GROUP BY OBJECT_FK ) SELECT OBJECT_FK FROM RankedObjects WHERE rnk = 1;
说明:
DENSE_RANK()会为计数相同的记录分配相同的排名,确保所有计数最高的记录都会被标记为rnk=1- 如果误用
ROW_NUMBER(),会给并列的记录分配不同序号,只能返回其中一条,不符合需求
方法2:先获取最大计数值再筛选
如果你的SQL Server版本不支持窗口函数(如2005之前),可以用这种兼容性更强的方式:
-- 先查询出最高计数值 DECLARE @MaxCount INT; SELECT @MaxCount = MAX(totalCount) FROM ( SELECT COUNT(OBJECT_FK) AS totalCount FROM #TempTable GROUP BY OBJECT_FK ) AS Counts; -- 筛选计数等于最大值的OBJECT_FK SELECT OBJECT_FK FROM #TempTable GROUP BY OBJECT_FK HAVING COUNT(OBJECT_FK) = @MaxCount;
也可以写成子查询形式:
SELECT OBJECT_FK FROM #TempTable GROUP BY OBJECT_FK HAVING COUNT(OBJECT_FK) = ( SELECT MAX(totalCount) FROM ( SELECT COUNT(OBJECT_FK) AS totalCount FROM #TempTable GROUP BY OBJECT_FK ) AS Counts );
之前尝试失败的原因
- 直接用
totalCount = MAX(totalCount)报错:SQL Server不允许在同一层的WHERE/HAVING中引用SELECT子句的别名,必须通过子查询或窗口函数间接引用 - 嵌套子查询后再次分组:内层已经完成分组统计,外层重复分组会让每个分组的
MAX(totalCount)等于自身值,导致HAVING条件永远成立,最终返回所有记录
内容的提问来源于stack exchange,提问作者psibot
相关产品推荐
相关产品推荐

