#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. Результаты упорядочены по годам и месяцам.