MySQL只计算同一组中的行的行差异
我有下表称之为trans: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
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等等。。。定时订购