すべての行について、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 の例を参照してください。 。