Выходной месяц с наибольшим количеством отмен

#sql #sql-server

#sql #sql-сервер

Вопрос:

Я могу получить количество отмененных участников за каждый месяц с 2018 года, используя приведенный ниже запрос —

 SELECT DATEPART(YEAR, Cancel) [Year],
DATEPART(Month, Cancel) [Month], COUNT(1) [Count]
FROM Subscription
where DATEPART(YEAR, Cancel) >= 2018
GROUP BY DATEPART(year, Cancel),DATEPART(Month, Cancel)
ORDER BY 1,2
  

Результат равен

 Year    Month    Count
2018    1        6416775
2018    2        458171
2018    3        29963575
2018    4        65393505
  

Как мне изменить этот запрос, чтобы он отображал только месяц с наибольшим количеством отмен?

Обновить

Это тот результат, который я хочу. В каждом году должно выводиться наибольшее Count значение.

 Year    Month    Count
2018    4        65393505
2019    2        458171
  

Месяц 4 в 2018 году был выведен, потому что он имел наибольшее значение по сравнению с первыми 4 месяцами.

Ответ №1:

Используя order by count desc и выбирая первую запись по top 1 , вы можете получить желаемый результат:

 SELECT TOP 1 DATEPART(YEAR, Cancel) [Year],
DATEPART(Month, Cancel) [Month], COUNT(1) [Count]
FROM Subscription
where DATEPART(YEAR, Cancel) >= 2018
GROUP BY DATEPART(year, Cancel),DATEPART(Month, Cancel)
ORDER BY Count DESC
  

Комментарии:

1. Это не то, что мне нужно. Я обновил свой вопрос, чтобы уточнить.

2. @Aaron проверьте мой ответ, пожалуйста

3. Это не то, что мне нужно. Мне нужна 1 запись на каждый год.

Ответ №2:

попробуйте, как показано ниже, используя row_number()

 with cte as
(
SELECT DATEPART(YEAR, Cancel) [Year],
DATEPART(Month, Cancel) [Month], COUNT(1) [Count]
FROM Subscription
where DATEPART(YEAR, Cancel) >= 2018
GROUP BY DATEPART(year, Cancel),DATEPART(Month, Cancel)
ORDER BY 1,2
)
,cte1 as
( select *,ROW_NUMBER() OVER( partition by [Year] ORDER BY [Count] DESC) rn  from cte
) select * from cte1 where rn=1
  

Комментарии:

1. Это не то, что мне нужно. Мне нужна 1 запись на каждый год. Это приводит к созданию более 1 записи за определенный год.

2. Отредактированный ответ просто удалите месяц из раздела

Ответ №3:

ПОПРОБУЙТЕ следующее

SELECT *
FROM (SELECT DATEPART(YEAR, Cancel) [Year], DATEPART(Month, Cancel) [Month], COUNT(1) [Count]
FROM Subscription
WHERE DATEPART(YEAR, Cancel) >= 2018
GROUP BY DATEPART(year, Cancel),DATEPART(Month, Cancel)
ORDER BY 1,2) as Table1
WHERE Count = (SELECT MAX COUNT(1) [Count]
FROM Subscription
WHERE DATEPART(YEAR, Cancel) >= 2018
GROUP BY DATEPART(year, Cancel),DATEPART(Month, Cancel)
ORDER BY 1,2)

Комментарии:

1. Это не то, что мне нужно. Мне нужна 1 запись на каждый год. Это приводит к созданию более 1 записи за определенный год.

2. ORDER BY 1,2 Служит ли это какой-либо цели в вашем запросе?

3. Результаты упорядочены по годам и месяцам.