For hver række skal du finde en første række med højere (senere) LogDate. Hvis hastigheden i denne række er mindre end 10, skal du tælle datoforskellen mellem denne rækkes dato og næste rækkes dato, ellers skal du sætte 0.
En forespørgsel, der ville give en liste over de værdier, der tælles på denne måde, skulle se sådan ud:
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
Nu er det bare et spørgsmål om at opsummere det:
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
Opdatering efter kommentar om tilføjelse af CarId:
Når du har mere end 1 bil, skal du tilføje endnu en WHERE-tilstand i afhængig underforespørgsel (vi vil have næste log for den nøjagtige bil, ikke bare en hvilken som helst næste log) og gruppere hele rækkesættet efter CarId, eventuelt tilføje nævnte CarId til valget for at vise det også.
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
Se et eksempel på Sqlfiddle .