Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Soma a diferença de data de várias linhas Mysql


Para cada linha, encontre uma primeira linha com LogDate maior (posterior). Se a velocidade nesta linha for menor que 10, conte a diferença de data entre a data desta linha e a data da próxima linha, senão coloque 0.

Uma consulta que forneceria uma lista dos valores contados dessa maneira deve ter a seguinte aparência:
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

Agora é só resumir:
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

Atualização após comentário sobre como adicionar CarId:

Quando você tem mais de 1 carro, você precisa adicionar mais uma condição WHERE dentro da subconsulta dependente (queremos o próximo log para esse carro exato, não apenas qualquer próximo log) e agrupar todo o conjunto de linhas por CarId, possivelmente adicionando o CarId ao select para mostrar isso também.
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

Veja um exemplo em Sqlfiddle .