SQL Количество записей, которые появляются более одного раза в месяц и агрегируются по месяцам - PullRequest
0 голосов
/ 23 сентября 2019

Я просматриваю тонну записей и хочу посчитать, сколько раз идентификатор обновляется чаще, чем раз в месяц.

SELECT COUNT(*) AS Frequency, MONTH(Date) AS MM, YEAR(Date) AS YYYY, Id 
FROM data
WHERE -- [some filtering] 
    AND Date <=  -- end date 
    AND Date >=  -- start date 
GROUP BY Date, Id
    HAVING COUNT(*) > 1 
ORDER BY MM DESC

Теперь происходит то, что я нахожу только количество идентификаторов, которые обновляются более одного раза в день.Я хочу сгруппировать идентификаторы по месяцам.

Я пытался использовать столбец MM в своем GROUP BY, но затем я получаю коды ошибок, указывающие, что это неверный выбор столбцов.

Я пытался использовать следующую GROUP BY:

GROUP BY DATEPART(MONTH, Date), Id

Все, что я получаю - это непрерывные ошибки 8120, и я не могу понять, как мне это собрать.Любая помощь будет принята с благодарностью.

1 Ответ

1 голос
/ 23 сентября 2019

Сначала давайте исправим ваш запрос, чтобы он правильно агрегировал:

SELECT COUNT(*) AS Frequency, MONTH(Date) AS MM, YEAR(Date) AS YYYY, Id 
FROM data with(NOLOCK)
WHERE -- [some filtering] 
GROUP BY MONTH(Date), YEAR(Date), Id
HAVING COUNT(*) > 1 
ORDER BY YYYY, MM DESC

Это дает вам список Id с, которые обновлялись более одного раза в месяц.

Теперь,если вы хотите узнать, сколько Id обновлялось более одного раза в месяц, вы можете добавить еще один уровень агрегирования:

SELECT MM, YYY, COUNT(*)
FROM (
    SELECT COUNT(*) AS Frequency, MONTH(Date) AS MM, YEAR(Date) AS YYYY, Id 
    FROM data with(NOLOCK)
    WHERE -- [some filtering] 
    GROUP BY MONTH(Date), YEAR(Date), Id
    HAVING COUNT(*) > 1 
) x
ORDER BY YYYY, MM DESC
...