问题很多,但我似乎找不到与我遇到的情况相匹配的问题。我想在前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
该表的日期范围涵盖数月,每月有数千行。我想做的是一个查询,告诉我哪个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。谢谢您的帮助!
我刚刚尝试了一个与@Charles
Bretana给出的查询非常相似的查询,它确实起作用。我使用了VIEW来帮助澄清问题。
CREATE TABLE my_data (
my_date DATE,
ip_address CHAR(15)
);
插入一堆日期/ IP地址对(未显示)…
为每月所有计数和IP地址创建一个视图:
CREATE VIEW my_data_per_month as
SELECT EXTRACT(YEAR_MONTH FROM my_date) AS month,
ip_address, COUNT(*) AS hits
FROM my_data
GROUP BY month, ip_address;
SELECT * FROM my_data_per_month
ORDER BY month ASC, hits DESC;
+--------+-----------------+------+
| month | ip_address | hits |
+--------+-----------------+------+
| 200901 | 999.999.999.999 | 8 |
| 200901 | 999.999.999.998 | 6 |
| 200901 | 999.999.999.997 | 5 |
| 200901 | 999.999.999.996 | 4 |
| 200901 | 999.999.999.995 | 3 |
| 200901 | 999.999.999.994 | 2 |
| 200902 | 999.999.999.998 | 8 |
| 200902 | 999.999.999.997 | 6 |
| 200902 | 999.999.999.996 | 5 |
| 200902 | 999.999.999.995 | 4 |
| 200902 | 999.999.999.994 | 3 |
| 200902 | 999.999.999.993 | 2 |
| 200903 | 999.999.999.997 | 8 |
| 200903 | 999.999.999.996 | 6 |
| 200903 | 999.999.999.995 | 5 |
| 200903 | 999.999.999.994 | 4 |
| 200903 | 999.999.999.993 | 3 |
| 200903 | 999.999.999.992 | 2 |
+--------+-----------------+------+
现在显示每月前三个IP地址:
SELECT m1.month, m1.ip_address, m1.hits
FROM my_data_per_month m1
LEFT OUTER JOIN my_data_per_month m2
ON (m1.month = m2.month AND m1.hits < m2.hits)
GROUP BY m1.month, m1.ip_address
HAVING COUNT(*) < 3
ORDER BY m1.month ASC, m1.hits DESC;
+--------+-----------------+------+
| month | ip_address | hits |
+--------+-----------------+------+
| 200901 | 999.999.999.999 | 8 |
| 200901 | 999.999.999.998 | 6 |
| 200901 | 999.999.999.997 | 5 |
| 200902 | 999.999.999.998 | 8 |
| 200902 | 999.999.999.997 | 6 |
| 200902 | 999.999.999.996 | 5 |
| 200903 | 999.999.999.997 | 8 |
| 200903 | 999.999.999.996 | 6 |
| 200903 | 999.999.999.995 | 5 |
+--------+-----------------+------+
问题内容: 我有这样的查询: 但是我只想对前400名进行此操作。我尝试添加“ limit 0,400”(就像我在查询中那样),但这没有用。我进行了一些搜索,而mysql似乎不像SQL Server那样支持TOP(n)命令。 知道我该怎么做吗? 编辑:为了将来参考,我使用以下样式进行选择,效果很好: 但无论出于何种原因,在更新中它都不会与“ 0”一起使用。我会认为这种不一致和模棱两可的行为,但是哦。
问题内容: 我有一个表格,我需要在其中获取每个类别的前n个最高金额的项目。 我期望的输出是前2个类别中的最高清单。 问题答案: 这应该为您工作。如果它不满足您的要求,请发回您需要的内容。您最初希望有25个,所以您只需将最后一个子句修改为 如果要从表中选择更多列,只需将它们添加到和“ GROUP BY”子句中。 仅当您要扩展“ 每个Category,foo,bar的TOP n ”时,才将这些列也添加
问题内容: 我真的很困惑查询需要返回在特定列上具有最大值的前N行。 例如,如果行具有相同的值。我必须返回还是要排。 问题答案: 如果您这样做: 您将获得前N行。 如果您这样做: 或者,您可以将其表达为: 从概念上讲,以下是您想要执行的操作,但在MySQL中可能不起作用:
问题内容: 如何从表中选择前n个最大值? 对于这样的表: 对于n = 2,结果需要为: 下面的方法仅为每个组选择最大值。 返回值: 问题答案: 对于n = 2,您可以 对于任何n,您都可以使用此处介绍的方法模拟分区之上的排名。 编辑:其实这个文章会给你你需要什么。 基本上是这样的 用要分组的列的名称和保存值的列的名称替换。 要弄清楚它的功能是如何进行的,请从最内部的查询中逐步进行并运行它们。 而且
问题内容: 我有一张这样的桌子: 我需要按升序排列每个字母的前2个: 我该怎么办?使用GROUP BY获得前1名非常简单,但是我似乎无法让它适用于多个条目 问题答案: 编辑:(我的第一次尝试将无法在MySql(Quassnoi注释)上工作,例如,我将其修改为可在sql服务器上工作) 第二次尝试:
问题内容: 我已阅读这篇文章:http : //www.xaprb.com/blog/2006/12/07/how- to-select-the-firstleastmax-row-per-group-in- sql/ 并搜索其他问题 我有一个像这样的表: 我正在尝试获取按user.id分组的table.id的计数,如果user.id的计数大于7,则仅将结果显示为7(也就是将计数结果限制为7)。