2016-10-06 1 views
1

У меня есть таблица вроде этого:счетчика SQL вхождения строки

c1 | c2
| 2
b | 1
a | 1
b | 3
a | 2

как посчитать это, чтобы получить результат, как этот

col1 | col2 | количество вхождений
a | 1 | 1
a | 2 | 2
b | 3 | 1

И после того, как получить максимальное значение, как это:

col1col2
| 2
б | 1

+5

Подсказка: 'GROUP BY'. –

ответ

2

Count 1 ваш друг, граф * приводит к более длительное время загрузки.

SELECT C1, C2, COUNT(1) AS numberofoccurrences 
FROM TABLE 
GROUP BY C1, C2 

Извините за задержку. Чтобы использовать Max, используйте;

; WITH CTE AS(
    SELECT c1, c2, COUNT(1) AS NoOfOccurence FROM TEST 
    GROUP BY c1, c2 
), BTE AS(
    SELECT c1, c2, ROW_NUMBER() OVER(PARTITION BY c1 ORDER BY NoOfOccurence DESC) AS RN FROM CTE 
)SELECT c1, c2 FROM BTE WHERE RN = 1 
+2

Ваше утверждение, что 'count (1)' будет лучше, чем 'count (*)', неверно; они эквивалентны. См. Https://stackoverflow.com/questions/1221559/count-vs-count1 для подробного обсуждения этого вопроса. – jpw

+0

Thats work fine, спасибо, У меня есть последние вопросы, как получить от этого максимального значения, вот так a | 2 | 2 b | 3 | 1 –

+0

Это смешно. 'count (1)' будет * медленнее *, не будет ли оптимизатор преобразовывать его в 'count (*)' внутренне. 'count (*)' = выбирать строки. 'count (1)' = выбирать строки, генерировать 1 в каждой строке, проверять, не является ли значение 1, если оно не считается. –

0

Вот полное решение, которое включает окончательный вывод максимального значения. Также обратите внимание, что индекс на c1 и c2 значительно улучшит производительность.

-- Sample data 
-- including an id for use as a tie-breaker for a unique pk/clustered index on c1 & c2 
DECLARE @tbl TABLE 
    (id int identity not null, c1 char(1), c2 tinyint, primary key (c1,c2,id)); 
INSERT @tbl VALUES ('a', 2), ('b', 1), ('a', 1), ('b', 3), ('a', 2); 

-- Solution 
SELECT c1, MaxOccurs = MAX(c) 
FROM 
(
    SELECT c1, c2, c = COUNT(1) 
    FROM @tbl 
    GROUP BY c1, c2 
) x 
GROUP BY c1;