В stackoverflow есть много вопросов по SQL Top N, но я не могу найти тот, который соответствует ситуации, которая у меня есть. Я хотел бы выполнить некоторую группировку в верхнем n запросе. Мои данные выглядят так (очевидно, с поддельными значениями).Группировка по Top N в MySQL
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
Но что я действительно хочу, чтобы иметь возможность видеть верхнюю п за каждый месяц в наборе данных. Это существенно запрещает мне использовать предложение 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. Спасибо за помощь!
Возвращаясь к этим месяцам позже, я, наконец, пробовал это, и он работает БОЛЬШОЕ! Спасибо! –