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

Sum flere rækker datoforskel Mysql

For hver række skal du finde en første række med højere (senere) LogDate. Hvis hastigheden i denne række er mindre end 10, skal du tælle datoforskellen mellem denne rækkes dato og næste rækkes dato, ellers skal du sætte 0.

En forespørgsel, der ville give en liste over de værdier, der tælles på denne måde, skulle se sådan ud:

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

Nu er det bare et spørgsmål om at opsummere det:

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

Opdatering efter kommentar om tilføjelse af CarId:

Når du har mere end 1 bil, skal du tilføje endnu en WHERE-tilstand i afhængig underforespørgsel (vi vil have næste log for den nøjagtige bil, ikke bare en hvilken som helst næste log) og gruppere hele rækkesættet efter CarId, eventuelt tilføje nævnte CarId til valget for at vise det også.

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

Se et eksempel på Sqlfiddle .



  1. Sideinddeling med OFFSET / FETCH:En bedre måde

  2. Hvordan kan jeg bruge UUID'er i SQLAlchemy?

  3. Forstå MySQL TRUNCATE TABLE ved hjælp af praktiske eksempler

  4. Vil du gemme PHP-array til MySQL?