sql >> Base de Datos >  >> RDS >> Mysql

Suma Múltiples Filas Fecha Diferencia Mysql

Para cada fila, busque una primera fila con LogDate más alto (posterior). Si la velocidad en esta fila es inferior a 10, cuente la diferencia de fechas entre la fecha de esta fila y la fecha de la fila siguiente; de ​​lo contrario, coloque 0.

Una consulta que daría una lista de los valores contados de esta manera debería verse así:

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

Ahora solo es cuestión de resumirlo:

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

Actualización después del comentario sobre agregar CarId:

Cuando tiene más de 1 automóvil, debe agregar una condición WHERE más dentro de la subconsulta dependiente (queremos el siguiente registro para ese automóvil exacto, no solo cualquier registro siguiente) y agrupar todo el conjunto de filas por CarId, posiblemente agregando dicho CarId a la selección para mostrar también.

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

Vea un ejemplo en Sqlfiddle .