Pour chaque ligne, recherchez une première ligne avec une LogDate plus élevée (plus tardive). Si la vitesse dans cette ligne est inférieure à 10, comptez la différence de date entre la date de cette ligne et la date de la ligne suivante, sinon mettez 0.
Une requête qui donnerait une liste des valeurs comptées de cette manière devrait ressembler à :
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
Il ne reste plus qu'à résumer :
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
Mise à jour après un commentaire sur l'ajout de CarId :
Lorsque vous avez plus d'une voiture, vous devez ajouter une autre condition WHERE dans la sous-requête dépendante (nous voulons le prochain journal pour cette voiture exacte, pas n'importe quel journal suivant) et regrouper l'ensemble de lignes entier par CarId, en ajoutant éventuellement ledit CarId à la sélection pour afficher lui aussi.
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
Voir un exemple sur Sqlfiddle .