Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Summe mehrere Zeilen Datumsdifferenz Mysql

Suchen Sie für jede Zeile eine erste Zeile mit einem höheren (späteren) LogDate. Wenn die Geschwindigkeit in dieser Zeile kleiner als 10 ist, zähle die Datumsdifferenz zwischen dem Datum dieser Zeile und dem Datum der nächsten Zeile, andernfalls setze 0 ein.

Eine Abfrage, die eine Liste der auf diese Weise gezählten Werte liefert, sollte wie folgt aussehen:

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

Jetzt ist es nur noch eine Frage der Zusammenfassung:

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

Update nach Kommentar zum Hinzufügen von CarId:

Wenn Sie mehr als 1 Auto haben, müssen Sie eine weitere WHERE-Bedingung in der abhängigen Unterabfrage hinzufügen (wir wollen das nächste Protokoll für genau dieses Auto, nicht nur irgendein nächstes Protokoll) und das gesamte Rowset nach CarId gruppieren, wobei Sie möglicherweise die CarId zur Auswahl hinzufügen, um sie anzuzeigen es auch.

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

Ein Beispiel finden Sie unter Sqlfiddle .