一尘不染

求和多行日期差异Mysql

sql

表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查询中计算它。谢谢你。


阅读 117

收藏
2021-05-16

共1个答案

一尘不染

对于每一行,请找到具有较高(较晚)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的示例。

2021-05-16