För varje rad, hitta en första rad med högre (senare) LogDate. Om hastigheten på den här raden är mindre än 10, räkna datumskillnaden mellan denna rads datum och nästa rads datum, annars sätt 0.
En fråga som skulle ge en lista över de värden som räknas på detta sätt bör se ut så här:
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 är det bara att summera 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
Uppdatering efter kommentar om att lägga till CarId:
När du har mer än 1 bil måste du lägga till ytterligare ett WHERE-villkor i den beroende underfrågan (vi vill ha nästa logg för den exakta bilen, inte bara vilken nästa logg som helst) och gruppera hela raduppsättningen efter CarId, eventuellt lägga till nämnda CarId i rutan för att visa det också.
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 ett exempel på Sqlfiddle .