प्रत्येक पंक्ति के लिए, उच्च (बाद में) लॉगडेट वाली पहली पंक्ति खोजें। यदि इस पंक्ति में गति 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 पर एक उदाहरण देखें ।