Mysql 按日期分组的15分钟间隔的计数数据
我有以下MySQL表:Mysql 按日期分组的15分钟间隔的计数数据,mysql,sql,Mysql,Sql,我有以下MySQL表: +---------------------+-----------+ | timestamp | sensor_id | +---------------------+-----------+ | 2010-04-09 01:42:31 | M049 | | 2010-04-09 01:43:31 | M049 | | 2010-04-09 01:44:31 | M049 | | 2010-04-09 01:59:31
+---------------------+-----------+
| timestamp | sensor_id |
+---------------------+-----------+
| 2010-04-09 01:42:31 | M049 |
| 2010-04-09 01:43:31 | M049 |
| 2010-04-09 01:44:31 | M049 |
| 2010-04-09 01:59:31 | M049 |
| 2010-04-10 01:10:31 | M049 |
| 2010-04-10 01:40:31 | M049 |
| 2010-04-10 01:42:31 | M049 |
| 2010-04-11 16:43:31 | M049 |
+---------------------+-----------+
我知道如何查询数据库以获得特定白天间隔的条目计数,并按日期对结果进行分组
查询凌晨1点到下午2点之间的事件计数的示例如下所示:
SELECT
date(timestamp) as date,
count(timestamp) as count
FROM
event_data
WHERE
EXTRACT(HOUR FROM TIME(timestamp)) BETWEEN 1 AND 14
GROUP BY
date
查询返回下表:
+------------+-------+
| date | count |
+------------+-------+
| 2010-04-09 | 4 |
| 2010-04-10 | 3 |
+------------+-------+
现在我只想每15分钟统计一次事件。
预期的结果将是:
+------------+-------+
| date | count |
+------------+-------+
| 2010-04-09 | 2 |
| 2010-04-10 | 2 |
+------------+-------+
如何更改查询以获得这些结果?您可以根据日期分组并查询所需的小时数。类似地,您可以编写一个查询来获取时间间隔。首先,我将编写一个case语句,读取您想要的每一行,并添加一列,指定它的时间间隔。(0:14-1,15:29-2…)像这样:
SELECT timeCol,
HOUR(timeCol) AS hour,
CASE WHEN MINUTE(timeCol) BETWEEN 0 AND 14 THEN 1
WHEN MINUTE(timeCol) BETWEEN 15 AND 29 THEN 2
WHEN MINUTE(timeCol) BETWEEN 30 AND 44 THEN 3
ELSE 4 END AS minute
FROM myTable;
| timeCol | hour | minute |
+---------------------+------+--------+
| 2010-04-09 01:42:31 | 1 | 3 |
| 2010-04-09 01:43:31 | 1 | 3 |
| 2010-04-09 01:44:31 | 1 | 3 |
这给了你这样的东西:
SELECT timeCol,
HOUR(timeCol) AS hour,
CASE WHEN MINUTE(timeCol) BETWEEN 0 AND 14 THEN 1
WHEN MINUTE(timeCol) BETWEEN 15 AND 29 THEN 2
WHEN MINUTE(timeCol) BETWEEN 30 AND 44 THEN 3
ELSE 4 END AS minute
FROM myTable;
| timeCol | hour | minute |
+---------------------+------+--------+
| 2010-04-09 01:42:31 | 1 | 3 |
| 2010-04-09 01:43:31 | 1 | 3 |
| 2010-04-09 01:44:31 | 1 | 3 |
一旦有了这些,您就可以选择每天不同的小时/分钟对,只要您相应地使用WHERE子句,就可以得到您想要的:
SELECT DATE(timeCol) AS dateCol, COUNT(DISTINCT hour, minute) AS numEvents
FROM(
SELECT timeCol,
HOUR(timeCol) AS hour,
CASE WHEN MINUTE(timeCol) BETWEEN 0 AND 14 THEN 1
WHEN MINUTE(timeCol) BETWEEN 15 AND 29 THEN 2
WHEN MINUTE(timeCol) BETWEEN 30 AND 44 THEN 3
ELSE 4 END AS minute
FROM myTable) tmp
WHERE HOUR(timecol) BETWEEN 1 AND 14
GROUP BY dateCol;
这里有一个例子
我只想补充一点,你不必把时间间隔记录为1,2,3,4。确保你使用的是可读的东西,这在将来对你来说也是有意义的。例如,类似这样的东西可能会更好:
WHEN MINUTE(timeCol) BETWEEN 0 and 14 THEN 'firstInterval'...
为了澄清一下,你只想知道15分钟内任何事件发生的次数?那么,你每小时最多可以有4个事件?这正是我想要的。另外需要澄清的是,你想创建每15分钟的时间桶(例如:2010-04-09 13:00,2010-04-09 13:15…),还是按时间从一行中引用(例如:2010-04-10 01:402010-04-10 01:55…)@McAdam331谢谢,这就是为什么我发布了我的doubts@husker当我第一次读它的时候,我的想法和你一样。这就是我试图澄清的。我认为这解决了我的问题。在我实现了所有功能并按预期工作后,我将接受您的回答。非常感谢你!