2011-11-16 3 views
2

행에 MySubId이라는 열이 포함 된 테이블이 있습니다. 이 열의 값은 중복 될 수 있습니다. MySubId 값과 가장 많이 나타나는 MySubId 값에 대한 행 수를 찾고 싶습니다.SQL Server GROUP BY dilemma

나는 다음과 같은 쿼리를 가지고 :

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를 계산하기 전에 하위 쿼리를 포함해야합니까?

업데이트 :

내가 TOP 1를 사용하여 결과 세트를 필터링 anwers 많이 볼 수 있으므로이 쿼리를 필터링 할 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

이것은 단지 참고 일 뿐이다. – 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