Đối với mỗi hàng, hãy tìm hàng đầu tiên có Ngày đăng nhập cao hơn (sau này). Nếu tốc độ trong hàng này nhỏ hơn 10, hãy đếm chênh lệch ngày giữa ngày của hàng này và ngày của hàng tiếp theo, nếu không thì đặt 0.
Truy vấn cung cấp danh sách các giá trị được tính theo cách này sẽ trông giống như sau:
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
Bây giờ vấn đề chỉ là tổng hợp lại:
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
Cập nhật sau khi nhận xét về việc thêm CarId:
Khi bạn có nhiều hơn 1 ô tô, bạn cần thêm một điều kiện WHERE nữa bên trong truy vấn phụ phụ thuộc (chúng tôi muốn nhật ký tiếp theo cho chính xác ô tô đó, không chỉ bất kỳ nhật ký tiếp theo nào) và nhóm toàn bộ hàng theo CarId, có thể thêm CarId đã nói vào lựa chọn để hiển thị nó cũng vậy.
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
Xem ví dụ tại Sqlfiddle .