SQL Server GROUP BY дилемма - PullRequest
2 голосов
/ 17 ноября 2011

У меня есть таблица со строками, содержащей столбец с именем MySubId.Значения в этом столбце могут быть продублированы.Я хочу найти значение MySubId и количество строк для значения MySubId, которое отображается чаще всего.

У меня есть следующий запрос:

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

Но я получаюошибка:

Сообщение 130, уровень 15, состояние 1, строка 4 Не удается выполнить функцию агрегирования для выражения, содержащего агрегат или подзапрос.

Разве это невозможно?сделать это с помощью простого запроса?Нужно ли встраивать подзапрос для расчета MAX, прежде чем использовать его в предложении HAVING?

Обновление:

Я вижу множество ответов, фильтрующих результат, установленныйиспользуя TOP 1, поэтому я должен предположить, что нет способа использовать функцию MAX для фильтрации этого запроса по максимальному значению MySubId значений?

Ответы [ 4 ]

6 голосов
/ 17 ноября 2011
select top 1 with ties MySubId, Count(MySubId) as MySubIdCount
from MyTable
group by MuSubId
order by 2 desc
1 голос
/ 17 ноября 2011
select top 1 MySubId, Count(MySubId)
from MyTable
group by MySubId
order by count(MySubId) DESC
0 голосов
/ 17 ноября 2011
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
0 голосов
/ 17 ноября 2011

Это просто К вашему сведению, так как я считаю, что это будет следующим логическим шагом для плаката

Если вы хотите удалить все дубликаты, начиная с Новейшего ...

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...