sql >> Databasteknik >  >> RDS >> Mysql

Summa flera rader datumskillnad Mysql

För varje rad, hitta en första rad med högre (senare) LogDate. Om hastigheten på den här raden är mindre än 10, räkna datumskillnaden mellan denna rads datum och nästa rads datum, annars sätt 0.

En fråga som skulle ge en lista över de värden som räknas på detta sätt bör se ut så här:

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 är det bara att summera 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

Uppdatering efter kommentar om att lägga till CarId:

När du har mer än 1 bil måste du lägga till ytterligare ett WHERE-villkor i den beroende underfrågan (vi vill ha nästa logg för den exakta bilen, inte bara vilken nästa logg som helst) och gruppera hela raduppsättningen efter CarId, eventuellt lägga till nämnda CarId i rutan för att visa det också.

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 ett exempel på Sqlfiddle .



  1. Sträck ut databas i SQL Server 2016 RTM

  2. Varför returnerar AES_DECRYPT null?

  3. FEL 1062 (23000):Duplicera posten '2147483647' för nyckeln 'PRIMÄR'

  4. Starta MySQL Server automatiskt på Mac OS X Yosemite/El Capitan