Per ogni riga, trova una prima riga con LogDate più alto (successivo). Se la velocità in questa riga è inferiore a 10, conta la differenza di data tra la data di questa riga e la data della riga successiva, altrimenti inserisci 0.
Una query che fornisce un elenco dei valori contati in questo modo dovrebbe essere simile a:
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
Ora si tratta solo di riassumere:
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
Aggiornamento dopo il commento sull'aggiunta di CarId:
Quando hai più di 1 auto, devi aggiungere un'altra condizione WHERE all'interno della subquery dipendente (vogliamo il log successivo per quell'auto esatta, non solo un log successivo qualsiasi) e raggruppare l'intero set di righe per CarId, eventualmente aggiungendo detto CarId alla selezione per mostrare anche questo.
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
Guarda un esempio su Sqlfiddle .