Dla każdego wiersza znajdź pierwszy wiersz z wyższą (późniejszą) datą LogDate. Jeśli prędkość w tym wierszu jest mniejsza niż 10, policz różnicę dat między datą tego wiersza a datą następnego wiersza, w przeciwnym razie wpisz 0.
Zapytanie, które dałoby listę zliczonych w ten sposób wartości, powinno wyglądać tak:
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
Teraz wystarczy podsumować:
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
Aktualizacja po komentarzu o dodaniu CarId:
Gdy masz więcej niż 1 samochód, musisz dodać jeszcze jeden warunek WHERE wewnątrz zależnego podzapytania (chcemy następny dziennik dla tego samochodu, a nie tylko następny dziennik) i zgrupować cały zestaw wierszy według CarId, ewentualnie dodając ten CarId do zaznaczenia do wyświetlenia to też.
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
Zobacz przykład na Sqlfiddle .