Zoek voor elke rij een eerste rij met een hogere (later) LogDate. Als de snelheid in deze rij minder dan 10 is, tel dan het datumverschil tussen de datum van deze rij en de datum van de volgende rij, anders zet u 0.
Een zoekopdracht die een lijst geeft van de waarden die op deze manier worden geteld, zou er als volgt uit moeten zien:
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 is het gewoon een kwestie van samenvatten:
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
Update na opmerking over het toevoegen van CarId:
Als je meer dan 1 auto hebt, moet je nog een WHERE-voorwaarde toevoegen binnen de afhankelijke subquery (we willen het volgende logboek voor die exacte auto, niet zomaar een volgend logboek) en de hele rijen groeperen op CarId, waarbij mogelijk de genoemde CarId wordt toegevoegd aan de selectie om te tonen het ook.
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
Zie een voorbeeld op Sqlfiddle .