【问题标题】:Time difference between adjacent rows in one column of one mysql table一张mysql表的一列相邻行之间的时间差
【发布时间】:2020-09-29 18:49:11
【问题描述】:

我有一个包含大约 100.000 行的表,其结构如下:

+------+---------------------+-----------+
| id   | timestamp           | eventType |
+------+---------------------+-----------+
|   12 | 2015-07-01 16:45:47 |      3001 |
|  103 | 2015-07-10 19:30:14 |      3001 |
| 1174 | 2015-09-03 12:57:08 |      3001 |
+------+---------------------+-----------+

对于每一行,我想计算这一行和上一行的时间戳之间的天数。 如您所见,id 不是连续的,该表包含不同的事件,我只想比较一个特定事件随时间变化的时间戳。

我知道,对于两个数据的比较,可以使用 DATEDIFF,我将使用查询定义两行,该查询通过特定 id 选择行。 但由于我有很多 1000 行,我正在寻找一种方法来以某种方式遍历整个表。

不幸的是,我的 sql 知识有限,搜索并没有找到与我的问题足够接近的示例,因此我将继续从那里开始。 我会非常感谢任何提示。

【问题讨论】:

  • 哪个版本的 MySQL? This is a lot easier in MySQL 8.
  • 在服务器上我有一个 mysql 5.7.31,但我可以将表转储到我的计算机上,以便在我有 mysql 8.0.13 的地方进行分析。所以这两种解决方案都与我相关。

标签: mysql sql datetime subquery window-functions


【解决方案1】:

如果您运行的是 MySQL 8.0,则可以使用 lag()。假设您想要以秒为单位的差异:

select t.*,
    timestampdiff(
        second, 
        lag(timestamp) over(partition by eventtype order by id),
        timestamp
    ) diff
from mytable t

在早期版本中,一种替代方法是相关子查询:

select t.*,
    timestampdiff(
        second, 
        (select timestamp from mytable t1 where t1.eventtype = t.eventtype and t1.id < t.id order by t1.id desc limit 1),
        timestamp
    ) diff
from mytable t

【讨论】:

  • 尊敬的 GMB,非常感谢。我今天会试一试。
  • 谢谢,你的建议很完美(使用 mysql 8.0.13)。稍后,我也会测试早期版本的解决方案。
猜你喜欢
  • 1970-01-01
  • 2016-09-17
  • 1970-01-01
  • 2017-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多