2011-11-16 120 views
2

我有一个包含名为MySubId的列的行。此列中的值可以重复。我想查找MySubId值和出现最多的MySubId值的行数。SQL Server GROUP BY困境

我有以下查询:

SELECT MySubId, COUNT(MySubId) AS MySubIdCount 
FROM MyTable 
GROUP BY MySubId 
HAVING COUNT(MySubId)=MAX(COUNT(MySubId)) 

但我得到的错误:

Msg 130, Level 15, State 1, Line 4 Cannot perform an aggregate function on an expression containing an aggregate or a subquery.

是没可能用一个简单的查询来做到这一点?在使用HAVING条款之前,是否必须嵌入子查询来计算MAX?

更新:

我看到很多anwers过滤结果通过TOP 1设定的,所以我是假设没有办法使用MAX功能来过滤这个查询只是最大出现MySubId值?

回答

6
select top 1 with ties MySubId, Count(MySubId) as MySubIdCount 
from MyTable 
group by MuSubId 
order by 2 desc 
+0

+1考虑到多个MySubIds共享相同的最大数量的可能性。 –

+0

+1(出于同样的原因) –

+1

+1不知何故,我从来不知道'带领带'存在,我一直这样做是一种艰难的方式永远... –

1
select top 1 MySubId, Count(MySubId) 
from MyTable 
group by MySubId 
order by count(MySubId) DESC 
0

这仅仅是一个供参考,因为我相信这将是海报

下一个合乎逻辑的步骤。如果要删除所有重复开始与最新的...

DECLARE @ROWCOUNT INT 
SET @ROWCOUNT = 1 

WHILE @ROWCOUNT > 0 
BEGIN 
    DELETE 
    FROM MyTable 
    WHERE ID IN 
    (
     SELECT MAX(ID) 
     FROM MyTable 
     GROUP By MySubID 
     HAVING COUNT(1) > 1 
    ) 
    SET @ROWCOUNT = @@ROWCOUNT 
END 
+0

这只是一个FYI – SQLMason

0
DECLARE @MyTable TABLE (
    MySubId INT 
) 

INSERT INTO @MyTable (MySubId) VALUES (1) 
INSERT INTO @MyTable (MySubId) VALUES (1) 
INSERT INTO @MyTable (MySubId) VALUES (1) 
INSERT INTO @MyTable (MySubId) VALUES (2) 
INSERT INTO @MyTable (MySubId) VALUES (2) 
INSERT INTO @MyTable (MySubId) VALUES (2) 
INSERT INTO @MyTable (MySubId) VALUES (2) 
INSERT INTO @MyTable (MySubId) VALUES (3) 
INSERT INTO @MyTable (MySubId) VALUES (3) 
INSERT INTO @MyTable (MySubId) VALUES (3) 
INSERT INTO @MyTable (MySubId) VALUES (3) 

;WITH Counts_CTE (MySubId, MySubIdCount, RowNumber) 
AS 
(
    SELECT 
     MySubId, 
     COUNT(MySubId) AS MySubIdCount, 
     DENSE_RANK() OVER (ORDER BY COUNT(MySubId) DESC) AS RowNumber 
    FROM @MyTable 
    GROUP BY MySubId 
) 
SELECT * 
FROM Counts_CTE 
WHERE RowNumber = 1