你只需要找出一些独特的东西,这将给你5分钟的间隔。
如果你花时间分钟,并除以5,那么你有独特的东西。例如,你可以GROUP BY CAST(EXTRACT(MINUTE FROM logTime)/ 5 AS unsigned),这会给你5分钟的时间间隔。/5默认情况下不会舍入。
要实际编写您的工作查询,请分阶段尝试。
首先,让我们得到的只是一分钟:
mysql> SELECT userid, EXTRACT(MINUTE FROM loggedtime) as minute from test;
+--------+--------+
| userid | minute |
+--------+--------+
| 1 | 45 |
| 2 | 4 |
| 2 | 5 |
| 4 | 20 |
| 3 | 20 |
| 6 | 30 |
| 7 | 35 |
+--------+--------+
7 rows in set (0.00 sec)
现在,让我们尝试做一个列值是,每次5分钟间隔您可以按组唯一的。这是分钟除以5,没有舍入(上面的值/ 5):
mysql> select userid, EXTRACT(MINUTE FROM loggedtime) AS minute, CAST(EXTRACT(MINUTE FROM loggedtime)/5 AS unsigned) FROM test;
+--------+--------+-------------------------------------------------------+
| userid | minute | CAST(EXTRACT(MINUTE FROM loggedtime)/5 AS unsigned) |
+--------+--------+-------------------------------------------------------+
| 1 | 45 | 9 |
| 2 | 4 | 1 |
| 2 | 5 | 1 |
| 4 | 20 | 4 |
| 3 | 20 | 4 |
| 6 | 30 | 6 |
| 7 | 35 | 7 |
+--------+--------+-------------------------------------------------------+
7 rows in set (0.01 sec)
最后,我们按该唯一列进行分组。此查询使用MIN()和MAX()显示该时间间隔中的第一个和最后一个时间戳,但如果您希望它与您的问题完全相同,则还可以计算截止时间。
mysql> SELECT COUNT(*) AS user_count, MIN(loggedtime) AS first_time,
MAX(loggedtime) AS last_time
FROM test
GROUP BY CAST(EXTRACT(MINUTE FROM loggedtime)/5 AS unsigned)
ORDER BY last_time;
+------------+---------------------+---------------------+
| user_count | first_time | last_time |
+------------+---------------------+---------------------+
| 2 | 2012-03-05 10:04:19 | 2012-03-05 10:05:09 |
| 2 | 2012-03-05 10:20:20 | 2012-03-05 10:20:24 |
| 1 | 2012-03-05 10:30:59 | 2012-03-05 10:30:59 |
| 1 | 2012-03-05 10:35:59 | 2012-03-05 10:35:59 |
| 1 | 2012-03-05 10:45:59 | 2012-03-05 10:45:59 |
+------------+---------------------+---------------------+
5 rows in set (0.00 sec)
不确定你可以单独使用SQL来完成此操作,也许首先按'userId'和'loggedtime'秒排序(时间必须是升序),然后创建一个新数组,循环遍历结果集并比较递增计数器没有超过5分钟限制。当您传递5分钟或达到新的用户标识时,使用用户标识和计数器在数组中创建一个新条目。 – Yaniro 2012-03-05 06:41:25
你的间隔的界限究竟是什么?它看起来好像您要将值10:01:00..10:05:59计为在10:05范围内; 10:06:00..10:10:59为10:10;等等。那是对的吗? – 2012-03-05 06:43:07
是的,你是正确的@jonathan。我如何在两次之间选择数据。例如。如果我需要记录的用户数在过去5分钟之间,直到这一次。你有什么主意吗? – learner 2012-03-05 06:44:16