Mysql 按日期分组的15分钟间隔的计数数据

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

我有以下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 |    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当我第一次读它的时候,我的想法和你一样。这就是我试图澄清的。我认为这解决了我的问题。在我实现了所有功能并按预期工作后,我将接受您的回答。非常感谢你!