我想在每次添加新记录时,将事件持续时间添加到以前的记录中。
我的做法是这样的
ID EventType EventTime EventDuration
-------------------------------------
1 TypeA 10:20 NULL
2 TypeB 09:30 NULL
3 TypeC 08:00 NULL
这就是我想实现的。
ID EventType EventTime EventDuration
-------------------------------------
1 TypeA 10:20 00:50
2 TypeB 09:30 01:30
3 TypeC 08:00 ...
4 ... ...
当一个新的记录被添加时(有ID,EventType和EventTime),前一个记录的持续时间(TypeB和TypeA之间的时间差)应该被添加到前一个记录的EventDuration列中。
到目前为止,我所拥有的是。
SELECT
id, EventTime,
timestampdiff(minute,
(SELECT EventTime
FROM TableName t2
WHERE t2.id < t1.id ORDER BY t2.id DESC LIMIT 1),EventTime)
AS EventDuration
FROM records t1
WHERE id = ....<this is where I get stuck, this should be a query that identifies the ID of latest EventTime record>
有什么建议吗?
(我运行的是MySQL 5.6.39)
如果你正在运行MySQL 8.0,你可以使用窗口函数来实现。
update mytable t
inner join (
select id, timediff(eventTime, lag(eventTime) over(order by eventTime)) event_duration
from mytable t
) t1 on t1.id = t.id
set t.event_duration = t1.event_duration
如果你想只更新最后一条记录,但只有一条记录,你就可以 order by
和 limit
的子查询中(或外层查询中)。
update mytable t
inner join (
select id, timediff(eventTime, lag(eventTime) over(order by eventTime)) event_duration
from mytable t
order by id desc
limit 1, 1
) t1 on t1.id = t.id
set t.event_duration = t1.event_duration
在较早的版本中,有一个选项是效仿 lag()
与窗口功能。
update mytable t
inner join (
select
id,
timediff(
(select min(eventTime) from mytable t1 where t1.eventTime > t.eventTime),
eventTime
) event_duration
from mytable t
) t1 on t1.id = t.id
set t.event_duration = t1.event_duration