mysql - 查询返回事件之间的时间差,按 id 分组

标签 mysql

我在 mysql 中有下表,我正在尝试查询它

id    |  type  |                  dt | seqid
--------------------------------------------
1001  |  login | 2017-07-11 01:52:39 | 1
1001  | change | 2017-07-11 01:53:07 | 2
1001  | logout | 2017-07-11 01:53:21 | 3
1002  |  login | 2017-07-11 14:08:20 | 1
1002  | logout | 2017-07-11 14:08:28 | 2
--------------------------------------------

我本质上需要显示根据 id 分组的每个事件(类型)之间的时间差。输出应该是这样的:

1001 | Login | 0   (0 calculated since login is the starting event)
1001 | change | 28 (difference between login and this event)
---------------------

等等。

我编写了以下查询

SELECT 
    curr.id, 
    curr.type, 
    TIMESTAMPDIFF(SECOND,curr.dt , prev.dt) as diff 
FROM 
    sys.rep AS curr 
LEFT JOIN sys.rep AS prev ON prev.seqid = (
    SELECT min(seqid) 
    FROM sys.rep WHERE  seqid > curr.seqid and id = curr.id
);

该查询对于一个 id 可以正常工作,但对于多个 id 则失败。如有任何帮助,我们将不胜感激。

最佳答案

例如

SELECT a.*
     , timediff(b.dt,a.dt) diff
  FROM 
     ( SELECT x.*
            , MIN(y.dt) next
         FROM my_table x
         JOIN my_table y
           ON y.id = x.id
          AND y.dt > x.dt
        GROUP
           BY x.id
     ) a
  JOIN my_table b
    ON b.id = a.id
   AND b.dt = a.next;

关于mysql - 查询返回事件之间的时间差,按 id 分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45043385/

相关文章:

mysql - Rails + MySQL - 从 3 个具有特定格式的表加载数据(非常慢 "has_many"关系)

mysql - 用作子查询时产生不同结果的查询

php - 使用 JQuery Serialize 时如何为空白字段插入 NULL 值?

javascript - 提交表单后刷新页面以显示所做操作的结果

php - 使用 Codeigniter 将表单输入中的字符串添加到 URL

mysql - 将加载数据文件与 select 语句连接起来

mysql - 包含 5 个指定值中的 2 个的行数

mysql - 是否可以使用 SQL 查询将数据从 MySQL 表插入到 MS Access 表?

mysql - 当计算机意外关闭时,mysql 数据会发生什么情况?

c# - 不允许主机连接到此 MySql 服务器