繁体   English   中英

根据MySQL 8中上一行的值更新一行

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM