You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 16:26:00