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

場所の変更による合計時間

    次のようにうまくいくようです:

    SET @locationID=0,@ts=NULL,@changed=0;
    
    SELECT
      MIN(assetID) AS id
      , MIN(locationID) AS location
      , SUM(secDiff) AS duration
    FROM
      (SELECT
        assetID
        , locationID
        , @changed := IF(locationID <> previousLocationID, @changed + 1, @changed) AS changed
        , IFNULL(TIMESTAMPDIFF(SECOND,
                               previousTs,
                               ts
                               ),
                 0
          ) AS secDiff
      FROM
        (SELECT
          assetID
          , locationID
          , @locationID AS previousLocationID
          , @locationID := locationID AS currentLocationID
          , ts
          , @ts AS previousTs
          , @ts := ts AS currentTs
        FROM Logs L1
        WHERE assetid = 1157    
        ORDER BY ts
        ) L2
      ORDER BY ts
      ) L3
    GROUP BY changed
    ORDER BY changed DESC
    ;
    

    実際の動作をご覧ください: SQL Fiddle

    更新:

    追加のテーブルを結合する必要がある場合は、実際にJOINする必要があります 副選択ではありません。 GROUP BYがあるので 現在の最外部レベルでは、ファクトテーブルがグループ化されないように、既存のステートメントを別の括弧のセットでラップする必要があります。その目的に向けて他のいくつかの調整を加えて:

    SET @locationID=0,@ts=NULL,@changed=0;
    
    SELECT
      A.name
      , L4.assetID
      , L.name
      , L4.locationID
      , duration
    FROM
      (SELECT
        MIN(assetID) AS assetID
        , MIN(locationID) AS locationID
        , SUM(secDiff) AS duration
        , changed
      FROM
        (
    -- no change in here
        ) L3
      GROUP BY changed
      ) L4
    JOIN Asset A
      ON L4.assetID = A.id
    JOIN Location L
      ON L4.locationID = L.id
    ORDER BY changed DESC
    ;
    

    拡張された SQL Fiddle 。

    更新2:

    重複するリストに対処する最も簡単な方法は、DISTINCTを使用することです。 最初のステップとしてそれらを離れて:

    -- no change here
      (SELECT
        assetID
        , locationID
        , @locationID AS previousLocationID
        , @locationID := locationID AS currentLocationID
        , ts
        , @ts AS previousTs
        , @ts := ts AS currentTs
      FROM
        (SELECT DISTINCT
          assetID
          , locationID
          , ts
        FROM Logs
        WHERE assetid = 1157
        ) L1
      ORDER BY ts
      ) L2
    -- no change here either
    

    この SQL Fiddle 複製されたログを返します SQLFiddle と同じ結果セットのデータ 、以前のクエリは重複のないデータに対して実行されます。

    調整/詳細が必要な場合はコメントしてください。




    1. 条件付きmySQLステートメント。真の場合はUPDATE、偽の場合はINSERT

    2. SQLiteSHOWTABLESと同等

    3. 過去24時間で最も人気のあるPHPMySQLクエリ

    4. ArrayList<String>を別のアクティビティに渡してdoubleに変換する方法