2011-11-16 3 views
2

J'ai une table avec des lignes contenant une colonne appelée MySubId. Les valeurs de cette colonne peuvent être dupliquées. Je veux trouver la valeur MySubId et le nombre de lignes pour la valeur MySubId qui apparaît le plus.SQL Server GROUP BY dilemme

J'ai la requête suivante:

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

Mais je reçois l'erreur:

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

est-il pas possible de le faire avec une simple requête? Dois-je incorporer une sous-requête pour calculer le MAX avant de l'utiliser dans la clause HAVING?

Mise à jour:

Je vois beaucoup de anwers filtrer le jeu de résultats en utilisant TOP 1, donc suis-je supposer qu'il n'y a aucun moyen d'utiliser la fonction MAX pour filtrer cette requête pour que le maximum apparaissant MySubId valeurs?

Répondre

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

+1 pour prendre en compte la possibilité de plusieurs MySubId partageant le même nombre maximal. –

+0

+1 (pour la même raison) –

+1

+1 D'une manière ou d'une autre, je n'ai jamais su que 'avec des cravates' existait et j'ai fait ceci de façon dure pour toujours ... –

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

Ceci est juste une FYI que je crois que ce serait la prochaine étape logique pour l'affiche

Si vous voulez supprimer tous les doublons en commençant par la plus récente ...

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

ceci est juste un 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