Untuk setiap baris, temukan baris pertama dengan LogDate yang lebih tinggi (nanti). Jika kecepatan pada baris ini kurang dari 10, hitung perbedaan tanggal antara tanggal baris ini dan tanggal baris berikutnya, jika tidak masukkan 0.
Kueri yang akan memberikan daftar nilai yang dihitung dengan cara ini akan terlihat seperti:
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
Sekarang tinggal menyimpulkannya saja:
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
Perbarui setelah komentar tentang menambahkan CarId:
Ketika Anda memiliki lebih dari 1 mobil, Anda perlu menambahkan satu lagi kondisi WHERE di dalam subquery dependen (kami ingin log berikutnya untuk mobil yang tepat itu, bukan sembarang log berikutnya) dan mengelompokkan seluruh baris berdasarkan CarId, mungkin menambahkan CarId tersebut ke pilih untuk ditampilkan itu juga.
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
Lihat contoh di Sqlfiddle .