Агрегировать БЕЗ группы, возвращая дубликаты

#sql-server #group-by #aggregate-functions

#sql-сервер #группировать по #агрегат-функции

Вопрос:

У меня есть следующие данные.

 Property, Value
Odd,1
Even,2
Odd,3
Even,4
Odd,5
Even,6
  

С помощью GROUP BY

 SELECT Property, COUNT(*) FROM Tab1 GROUP BY Property
  

Результат:

 Property, COUNT(*)
Odd 3
Even 3
  

Но когда я использую агрегатную функцию, она возвращает повторяющиеся значения.

 SELECT property,count(*) over (partition by property) AS count
FROM Tab1;
  

Результат

 Property, count
Even 3
Even 3
Even 3
Odd 3
Odd 3
Odd 3
  

Я хочу тот же результат, что и при использовании GROUP BY.


 SELECT property, count FROM (
SELECT property,count(*) over (partition by property) AS count
FROM Tab1) AS tab2;
  

Есть ли какой-либо другой метод, кроме этого?

Ответ №1:

Вот как работают оконные функции; вы получаете строку, возвращаемую для каждой строки в исходной таблице, а не агрегированную строку, как при использовании GROUP BY . Вы можете достичь того же результата, используя SELECT DISTINCT :

 SELECT DISTINCT property,
       COUNT(*) OVER (PARTITION BY property) AS count
FROM Tab1
  

Демонстрация на dbfiddle