Mysql
 sql >> Base de données >  >> RDS >> Mysql

Somme de la différence de date de plusieurs lignes Mysql

Pour chaque ligne, recherchez une première ligne avec une LogDate plus élevée (plus tardive). Si la vitesse dans cette ligne est inférieure à 10, comptez la différence de date entre la date de cette ligne et la date de la ligne suivante, sinon mettez 0.

Une requête qui donnerait une liste des valeurs comptées de cette manière devrait ressembler à :

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

Il ne reste plus qu'à résumer :

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

Mise à jour après un commentaire sur l'ajout de CarId :

Lorsque vous avez plus d'une voiture, vous devez ajouter une autre condition WHERE dans la sous-requête dépendante (nous voulons le prochain journal pour cette voiture exacte, pas n'importe quel journal suivant) et regrouper l'ensemble de lignes entier par CarId, en ajoutant éventuellement ledit CarId à la sélection pour afficher lui aussi.

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

Voir un exemple sur Sqlfiddle .