mysql - 使用 MySQL 的时间间隔 SQL 查询

标签 mysql sql group-by

我在数据库中有一个表,按时间存储日志数据。一天,数据库中可能有一百万行。时间不是任何固定的时间间隔。它有几个索引,包括时间。我想要做的是构建一个查询,该查询将返回一组行,每个时间间隔一行。例如,我可以执行查询以在一天中每 15 分钟返回 1 行。这将返回 24*60=96 行。返回的每一行实际上是在请求的间隔之前数据库中最近的行(因为数据库中的数据不等于请求的间隔)。

我不知道该怎么做。我不能只查询所有行的一组特定索引和时间间隔,因为它会将超过 1 GB 的数据加载到内存中,这太慢了。有没有使用 SQL 执行此操作的有效方法。我正在使用 MySQL 数据库。我愿意改变表索引/等等......

TIME

11:58
12:03
12:07
12:09
12:22
12:27
12:33
12:38
12:43
12:49
12:55

如果我想在 12:00 到 1:00 之间每隔 15 分钟查询一次,我会返回:

11:58 (nearest 12:00)
12:09 (nearest 12:15)
12:27 (nearest 12:30)
12:43 (nearest 12:45)
12:55 (nearest 1:00) 

如果这样更容易,我还可以将时间存储为数字(即自 1970 年以来的毫秒数)。在上面的查询中,这将是 900000 毫秒的间隔。

最佳答案

所以,我想到了这样的事情:

SELECT 
  MIN(timeValue)
FROM e
GROUP BY (to_seconds(timeValue) - (to_seconds(timeValue) % (60 * 5)))

..会为你做,但这只会返回整个表的 MIN(timeValue)。如果四舍五入到最接近的 5 分钟的秒数在它自己的列中,它就可以工作。

参见 SQL Fiddle

根据 Andiry 进行编辑,这有效:( http://sqlfiddle.com/#!2/bb870/6 )

SELECT MIN(t)
FROM e
GROUP BY to_seconds(t) DIV (60 * 5)

但这只给出了一行:( http://sqlfiddle.com/#!2/bb870/7 )

SELECT MIN(t)
FROM e
GROUP BY to_seconds(t) - (to_seconds(t) % (60 * 5))

有人知道为什么吗?

关于mysql - 使用 MySQL 的时间间隔 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10642344/

相关文章:

mysql - 通过 REGEX 对 IP 地址进行分组 MySQL 搜索

Mysql 计算每个值的频率并按另一个值分组(二维表)

php - 联合表的语法错误

python - mysql计算返回位置的距离

mysql - 提高 MySQL 更新查询效率

sql - 查询值为空的单行的列名?

sql - 用配置单元中的一个单元替换多个具有特定字符的单元

sql - 如何检查给定的字符串是sql server中的保留关键字

MySQL 仅选择数据透视表中的某些行和表中的所有行

php - 检查group by中是否有一行为空