sql >> データベース >  >> RDS >> Mysql

複数行の日付の差の合計Mysql

    すべての行について、LogDateが高い(後の)最初の行を見つけます。この行の速度が10未満の場合は、この行の日付と次の行の日付の日付の差をカウントします。それ以外の場合は、0を入力します。

    この方法でカウントされた値のリストを提供するクエリは、次のようになります。

    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
    

    今ではそれを要約するだけの問題です:

    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
    

    CarIdの追加に関するコメントの後に更新:

    複数の車がある場合は、依存サブクエリ内にもう1つのWHERE条件を追加し(次のログだけでなく、その正確な車の次のログが必要です)、行セット全体をCarIdでグループ化し、表示する選択にそのCarIdを追加する必要があります。それも。

    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
    

    Sqlfiddle の例を参照してください。 。



    1. MySQL-DESCによる注文でグループ化

    2. MySQLは最も近い5セントに切り上げます

    3. H2/MySQLで開いているデータベース接続のアクティブな数を見つける方法

    4. Pentaho Data Integration(Kettle)CommunityEditionからOracle12cデータベースに接続する