[英]Updating a row based on values from a previous row in MySQL 8
我有一个与此类似的表:
+---------------+---------------------+---------------------+-----------------------+
| event_type_id | start_time | end_time | hours_from_last_event |
+---------------+---------------------+---------------------+-----------------------+
| 1 | 2019-06-07 0:00:00 | 2019-06-07 22:00:00 | |
| 1 | 2019-06-09 21:00:00 | 2019-06-09 23:00:00 | |
| 1 | 2019-06-10 16:00:00 | 2019-06-10 20:00:00 | |
| 2 | 2019-06-05 14:00:00 | 2019-06-05 19:00:00 | |
| 2 | 2019-06-07 03:00:00 | 2019-06-07 21:00:00 | |
+---------------+---------------------+---------------------+-----------------------+
对于每一行,我要定hours_from_last_event
减去end_time
从上一行start_time
当前行只有当的event_type_id
是相等的。 如果该行没有上一行,则应为NULL
。
因此上表将变为:
+---------------+---------------------+---------------------+-----------------------+
| event_type_id | start_time | end_time | hours_from_last_event |
+---------------+---------------------+---------------------+-----------------------+
| 1 | 2019-06-07 0:00:00 | 2019-06-07 22:00:00 | NULL |
| 1 | 2019-06-09 21:00:00 | 2019-06-09 23:00:00 | 47 |
| 1 | 2019-06-10 16:00:00 | 2019-06-10 20:00:00 | 17 |
| 2 | 2019-06-05 14:00:00 | 2019-06-05 19:00:00 | NULL |
| 2 | 2019-06-07 03:00:00 | 2019-06-07 21:00:00 | 32 |
+---------------+---------------------+---------------------+-----------------------+
我们可以假设存在一个id
列来唯一地标识每一行。
我已经知道我可以使用TIMEDIFF()
函数来找到小时数的差异,但是我应该如何在MySQL中做到这一点呢?
您可以为此目的使用lag()
:
select t.*,
timestampdiff(hour, lag(end_time) over (partition by event_type_id orde rby start_time), start_time) as diff
from t;
但是您不能在update
使用它。 。 。 通过join
除外:
update t join
(select t.*,
timestampdiff(hour, lag(end_time) over (partition by event_type_id order by start_time), start_time) as diff
from t
) tt
on tt.event_type_id = t.event_type_id and tt.start_time = t.start_time
set t.hours_from_last_event = tt.diff;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.