За всеки ред намерете първи ред с по-висока (по-късна) LogDate. Ако скоростта на този ред е по-малка от 10, пребройте разликата в датата между датата на този ред и датата на следващия ред, в противен случай поставете 0.
Заявка, която би дала списък на стойностите, преброени по този начин, трябва да изглежда така:
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
Сега остава само да го обобщим:
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
Актуализация след коментар за добавяне на CarId:
Когато имате повече от 1 автомобил, трябва да добавите още едно условие WHERE в зависима подзаявка (ние искаме следващия регистрационен файл за точно тази кола, а не просто всеки следващ регистрационен файл) и да групирате целия набор от редове по CarId, като евентуално добавите споменатия CarId към избраното за показване също.
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
Вижте пример в Sqlfiddle .