MySQL只计算同一组中的行的行差异

MySQL只计算同一组中的行的行差异,mysql,Mysql,我有下表称之为trans: issue_id: state_one: state_two: timer: 1 A B 1 1 B C 3 2 A B 2 2 B C 4 2 C D

我有下表称之为trans:

issue_id:   state_one:  state_two:  timer:      
1           A           B           1
1           B           C           3

2           A           B           2
2           B           C           4
2           C           D           7
我希望获得连续行之间的“计时器”差异,但仅限于具有相同问题id的行

预期结果:

issue_id:   state_one:  state_two:  timer:    time_diff:                 
1           B           C           3         2

2           B           C           4         2
2           C           D           7         3
当计算两行之间的时差时,我希望结果显示在后面一行的旁边

如果表中只有一个按时间顺序排列的问题,则以下代码可以正常工作:

select 
    X.issue_id, 
    X.timer as X_timer,  
    Y.timer as Y_timer, 
    (X.timer - Y.timer) as time_diff
from trans X
cross join trans Y
where Y.timer in (
    select 
        max(Z.timer)
    from trans Z
    where Z.timer < X.timer);
我想将此方法推广到处理许多具有时间顺序状态更改的问题

我的想法是添加以下条件,但它仅在连续事件属于同一问题时有效,而不是在现实世界中:

... where Z.timer < X.timer)
and X.issue_id = Y.issueid;
问题:在MySQL中,我可以迭代地计算出问题_id=1的差异,然后计算问题_id=2的差异,依此类推吗?函数还是子查询

其他策略?约束:我有只读权限。我真的很感激你的帮助

编辑:我添加了预期输出,在示例表中添加了一行,并进行了澄清

select 
issue_id, (MAX(timer)-MIN(timer)) as diff from trans
group by issue_id
请给我答复


请给我回复

假设计时器或问题id,计时器是主要的

SELECT a.*, a.timer-MAX(b.timer)
  FROM trans a
  JOIN trans b
    ON b.issue_id = a.issue_id
   AND b.timer < a.timer
 GROUP
    BY a.issue_id
     , a.timer;

假设计时器或问题id,计时器是主

SELECT a.*, a.timer-MAX(b.timer)
  FROM trans a
  JOIN trans b
    ON b.issue_id = a.issue_id
   AND b.timer < a.timer
 GROUP
    BY a.issue_id
     , a.timer;


不太清楚。你期望的结果是什么?例如,“issue_id=1,result=2”。1您能否给出预期的输出。我假设在这种情况下它应该是null,2,null,2,但请确认。2对于同一问题,应如何确定订单?基于状态1,状态2?。如果状态*相同,那么您应该如何继续?很明显,如果命令行之间存在差异,那么如何获得差异?安德鲁,抱歉,我补充了我的预期result@Utsav,你是对的。我很乐意为问题的第一行保留一个空的时间差,或者在我的结果中省略我编辑问题以显示的那一行。我对输入表的排序逻辑是:按问题编号排序,计时器。对于输出,顺序对我来说并不重要。每一行都会告诉我这个问题在一个州花了多少时间。不是很清楚。你期望的结果是什么?例如,“issue_id=1,result=2”。1您能否给出预期的输出。我假设在这种情况下它应该是null,2,null,2,但请确认。2对于同一问题,应如何确定订单?基于状态1,状态2?。如果状态*相同,那么您应该如何继续?很明显,如果命令行之间存在差异,那么如何获得差异?安德鲁,抱歉,我补充了我的预期result@Utsav,你是对的。我很乐意为问题的第一行保留一个空的时间差,或者在我的结果中省略我编辑问题以显示的那一行。我对输入表的排序逻辑是:按问题编号排序,计时器。对于输出,顺序对我来说并不重要。每一行都会告诉我该问题在一个州花费的时间。谢谢Sam。不幸的是,我把我的示例简化了,我已经编辑了它。每期通常超过2行,因此max-min不会捕获所有的转换。谢谢Sam。不幸的是,我将我的示例过于简化,我已经编辑了它。每期通常超过2行,因此max-min不会捕获所有的转换。嗨,Rohit,谢谢你的回答。它适用于我最初提供的示例。不幸的是,我的原始示例过于简单,许多问题将超过2行。嗨,ojdajuiceman,谢谢你的回复。我期待着在回复时为你提供合适的查询。嗨,Rohit,谢谢你的回答。它适用于我最初提供的示例。不幸的是,我最初的例子过于简单,许多问题将有超过2行。嗨ojdajuiceman谢谢你的回复,我期待着在给你一个合适的查询后回复你。这太棒了。我刚刚在一张纸上写下了join+group by,我的头爆炸了,谢谢!!我也明白了为什么需要定时器作为主键。在我的实际问题中,一个问题可能有多个相同的时间戳。这个解决方案只返回两行中具有相同时间戳的一行。没问题,在运行此操作之前,我将清理我的表以排除重复的时间戳。很高兴它有所帮助。有时有助于理解GROUP BY子句所做的一个技巧是使用ORDER BY而不是GROUP BY写出相同的查询,并且不使用聚合函数,因此选择一个*、b.timer等等。。。按a.Timer点菜这太棒了。我刚刚在一张纸上写下了join+group by,我的头爆炸了,谢谢!!我也明白了为什么需要定时器作为主键。在我的实际问题中,一个问题可能有多个相同的时间戳。这个解决方案只返回两行中具有相同时间戳的一行。没问题,在运行此操作之前,我将清理我的表以排除重复的时间戳。很高兴它有所帮助。有时有助于理解GROUP BY子句所做的一个技巧是使用ORDER BY而不是GROUP BY写出相同的查询,并且不使用聚合函数,因此选择一个*、b.timer等等。。。定时订购