stackoverflow 上有很多 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 不允许在 UNION 中包含的查询语句中使用 ORDER BY。谢谢您的帮助!