我有一个带有日期戳的事件表,我想显示事件之间的时间间隔。例如,如果我有
event | datestamp
-------------------
a | 05:00
b | 07:00
c | 08:00
d | 12:00
...
我想写一个简单的查询给我
event | datestamp | last | since_last
-----------------------------------------
a | 05:00 | NULL | NULL
b | 07:00 | a | 2 hours
c | 08:00 | b | 1 hour
d | 12:00 | c | 4 hours
最后一列的格式并不重要——它可以是毫秒、秒、人类可读的东西,任何简单的东西。另请注意,实际数据具有正确的日期时间,我只是懒得输入日期。
重要的部分是“b”的记录中没有任何内容指向“a”作为前一个事件,所以像这个问题这样的解决方案不起作用——我需要一些语法来选择所有已加入的记录到最近的旧记录。
我尝试过的看起来像
SELECT new.event, new.datestamp, old.event AS last,
TIMESTAMPDIFF(SECOND, MAX(old.datestamp), new.datestamp) AS since_last
FROM events AS new, events AS old
WHERE new.datestamp > old.datestamp
LIMIT 10;
但它似乎只是挂起——我让它运行了一分钟多。根据这个问题,我试过了
SELECT event, datestamp,
(SELECT MAX(old.datestamp)
FROM events old
WHERE new.datestamp > old.datestamp
) last_ds
FROM events new
LIMIT 10;
这实际上有效,但在我的表上需要超过 14 秒的一百万个事件,即使我只选择 10 条记录,所以一定有问题。