Существует много вопросов по SQL Top N по стеку, но я не могу найти тот, который соответствует моей ситуации. Я хотел бы выполнить некоторую группировку в верхнем n запросе. Мои данные выглядят так (очевидно, с поддельными значениями).
MY_DATE IP_ADDRESS
1/1/09 999.999.999.999
1/1/09 999.999.999.999
1/1/09 999.999.999.998
... a lot more rows
Диапазон дат для таблицы охватывает несколько месяцев и имеет много тысяч строк в месяц. То, что я хотел бы сделать, - это один запрос, чтобы сказать мне, какие 10 IP-адресов встречались чаще всего за каждый месяц. Я могу сделать это в течение одного месяца, используя следующее:
SELECT DATE_FORMAT(MY_DATE, '%b-%y') AS "MONTH", IP_ADDRESS, COUNT(*) AS HITS
FROM MY_DATA
WHERE DATE_FORMAT(MY_DATE, '%b-%y') = 'JAN-09'
GROUP BY DATE_FORMAT(MY_DATE, '%b-%y'), IP_ADDRESS
ORDER BY HITS DESC
LIMIT 10
Но что я действительно хочу, так это иметь возможность видеть верхние n за каждый месяц в наборе данных. По сути, это запрещает мне использовать оговорку where, которую я указал. Конечно, когда я делаю это, я просто получаю 10 за все месяцы. Результат, который я ищу, должен выглядеть так:
MONTH IP_ADDRESS COUNT(*)
JAN-09 999.999.999.999 200
JAN-09 999.999.999.998 150
... ( 8 more rows of January )
FEB-09 999.999.999.999 320
FEB-09 999.999.999.998 234
... ( 8 more rows of February)
MAR-09 999.999.999.999 440
... ETC.
Можно ли это сделать в MySQL? Кажется, что я сталкиваюсь с препятствием в том, что MySQL не разрешает ORDER BY в операторе запроса, включенном в UNION. Спасибо за помощь!