表car_log
Speed LogDate 5 2013-04-30 10:10:09 ->row1 6 2013-04-30 10:12:15 ->row2 4 2013-04-30 10:13:44 ->row3 17 2013-04-30 10:15:32 ->row4 22 2013-04-30 10:18:19 ->row5 3 2013-04-30 10:22:33 ->row6 4 2013-04-30 10:24:14 ->row7 15 2013-04-30 10:26:59 ->row8 2 2013-04-30 10:29:19 ->row9
我想知道汽车在10以下的速度会持续多长时间。在我看来,我将计算第1行-第4行之间的LogDate差异(因为第4行与第3行之间的比例为10:14:44 =>,所以速度为4)+( (总和)第6行到第8行之间的LogDate差异。我怀疑是对还是不对。我如何在mysql查询中计算它。谢谢你。
对于每一行,请找到具有较高(较晚)LogDate的第一行。如果该行的速度小于10,则计算该行的日期与下一行的日期之间的日期差,否则输入0。
给出以这种方式计数的值的列表的查询应类似于:
SELECT ( SELECT IF( c1.speed <10, unix_timestamp( c2.LogDate ) - unix_timestamp( c1.logdate ) , 0 ) FROM car_log c2 WHERE c2.LogDate > c1.LogDate LIMIT 1 ) AS seconds_below_10 FROM car_log c1
现在,只需总结一下即可:
SELECT sum( seconds_below_10) FROM ( SELECT ( SELECT IF( c1.speed <10, unix_timestamp( c2.LogDate ) - unix_timestamp( c1.logdate ) , 0 ) FROM car_log c2 WHERE c2.LogDate > c1.LogDate LIMIT 1 ) AS seconds_below_10 FROM car_log c1 ) seconds_between_logs
关于添加CarId的评论后更新:
当您有多于1辆汽车时,您需要在相关子查询中添加一个WHERE条件(我们想要该确切汽车的下一个日志,而不仅仅是任何下一个日志),并按CarId对整个行集进行分组,可能在选择中添加上述CarId以显示它也。
SELECT sbl.carId, sum( sbl.seconds_below_10 ) as `seconds_with_speed_less_than_10` FROM ( SELECT c1.carId, ( SELECT IF( c1.speed <10, unix_timestamp( c2.LogDate ) - unix_timestamp( c1.logdate ) , 0 ) FROM car_log c2 WHERE c2.LogDate > c1.LogDate AND c2.carId = c1.carId LIMIT 1 ) AS seconds_below_10 FROM car_log c1 ) sbl GROUP BY sbl.carId
参见Sqlfiddle的示例。