【问题标题】:Updating a row based on values from a previous row in MySQL 8根据 MySQL 8 中前一行的值更新一行
【发布时间】:2019-08-02 15:00:36
【问题描述】:

我有一个类似这样的表:

+---------------+---------------------+---------------------+-----------------------+
| 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 |                       |
+---------------+---------------------+---------------------+-----------------------+

对于每一行,只有当event_type_id 相等时,我想通过从当前行的start_time 中减去上一行的end_time 来设置hours_from_last_event。如果该行没有前一行,则应为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 中执行此操作?

【问题讨论】:

  • 存储容易派生的数据通常被认为是个坏主意。

标签: mysql sql database select


【解决方案1】:

您可以为此目的使用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;

【讨论】:

  • 只是出于好奇,为什么不能在更新中使用LAG
  • @TimBiegeleisen 。 . .好吧,您可以尝试一下,看看您得到的错误。我怀疑原因是因为不清楚引用的“上一个”行是使用更新的值还是原始值。
  • 这似乎在我的本地机器上工作,但不幸的是,我正在使用的服务器版本不支持延迟功能,无论如何谢谢
猜你喜欢
  • 1970-01-01
  • 2016-06-24
  • 2019-07-06
  • 2021-12-16
  • 2021-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多