sql >> Databáze >  >> RDS >> Mysql

Součet více řádků rozdíl data Mysql

Pro každý řádek najděte první řádek s vyšším (pozdějším) LogDate. Pokud je rychlost v tomto řádku nižší než 10, počítejte rozdíl mezi datem tohoto řádku a datem následujícího řádku, jinak zadejte 0.

Dotaz, který by poskytl seznam takto spočítaných hodnot, by měl vypadat takto:

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

Teď jde jen o to to shrnout:

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

Aktualizace po komentáři o přidání CarId:

Když máte více než 1 auto, musíte do závislého dílčího dotazu přidat ještě jednu podmínku WHERE (chceme další protokol pro toto přesné auto, ne jen jakýkoli další protokol) a seskupit celou sadu řádků podle CarId, případně přidat uvedené CarId do výběru, aby se zobrazil to taky.

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

Podívejte se na příklad na Sqlfiddle .



  1. Jak MySQL určuje, kdy se má zobrazit explicitní znaková sada a hodnoty řazení?

  2. Používejte relační databáze MySQL na Ubuntu 10.04 LTS (Lucid)

  3. Ukládání obrázků na SQL Server?

  4. Jak přeskočit prázdná data v MySQL?