Mysql
 sql >> Database >  >> RDS >> Mysql

Somma più righe Data Difference Mysql

Per ogni riga, trova una prima riga con LogDate più alto (successivo). Se la velocità in questa riga è inferiore a 10, conta la differenza di data tra la data di questa riga e la data della riga successiva, altrimenti inserisci 0.

Una query che fornisce un elenco dei valori contati in questo modo dovrebbe essere simile a:

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

Ora si tratta solo di riassumere:

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

Aggiornamento dopo il commento sull'aggiunta di CarId:

Quando hai più di 1 auto, devi aggiungere un'altra condizione WHERE all'interno della subquery dipendente (vogliamo il log successivo per quell'auto esatta, non solo un log successivo qualsiasi) e raggruppare l'intero set di righe per CarId, eventualmente aggiungendo detto CarId alla selezione per mostrare anche questo.

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

Guarda un esempio su Sqlfiddle .