MySQL查询将持续时间添加到以前的记录中

问题描述 投票:0回答:1

我想在每次添加新记录时,将事件持续时间添加到以前的记录中。

我的做法是这样的

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 time duration
1个回答
0
投票

如果你正在运行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 bylimit 的子查询中(或外层查询中)。

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
© www.soinside.com 2019 - 2024. All rights reserved.