Pro každý řádek najděte první řádek s vyšším (pozdějším) LogDate. Pokud je rychlost v tomto řádku nižší než 10, počítejte rozdíl mezi datem tohoto řádku a datem následujícího řádku, jinak zadejte 0.
Dotaz, který by poskytl seznam takto spočítaných hodnot, by měl vypadat takto:
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
Teď jde jen o to to shrnout:
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
Aktualizace po komentáři o přidání CarId:
Když máte více než 1 auto, musíte do závislého dílčího dotazu přidat ještě jednu podmínku WHERE (chceme další protokol pro toto přesné auto, ne jen jakýkoli další protokol) a seskupit celou sadu řádků podle CarId, případně přidat uvedené CarId do výběru, aby se zobrazil to taky.
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
Podívejte se na příklad na Sqlfiddle .