我在数据库中有一个表,按时间存储日志数据。一天,数据库中可能有一百万行。时间不是任何固定的时间间隔。它有几个索引,包括时间。我想要做的是构建一个查询,该查询将返回一组行,每个时间间隔一行。例如,我可以执行查询以在一天中每 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/