Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Jumlahkan durasi waktu berdasarkan perubahan lokasi

Berikut ini tampaknya berhasil:

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
;

Lihat aksinya:SQL Fiddle .

Pembaruan:

Jika Anda perlu bergabung dengan tabel tambahan, Anda harus benar-benar JOIN dan bukan sub-pilih. Karena ada GROUP BY pada level terluar saat ini, pernyataan yang ada perlu dibungkus dengan tanda kurung lain - untuk mencegah pengelompokan tabel fakta. Dengan beberapa penyesuaian lain untuk tujuan itu:

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
;

Memperluas SQL Fiddle .

Pembaruan 2:

Cara paling mudah untuk mengatasi cantuman duplikat adalah dengan DISTINCT mereka pergi sebagai langkah pertama:

-- 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 ini pengembalian untuk Log . yang digandakan data hasil yang sama ditetapkan sebagai SQL Fiddle , di mana kueri sebelumnya dijalankan terhadap data tanpa duplikat.

Silakan berkomentar, jika dan karena ini memerlukan penyesuaian / detail lebih lanjut.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. String karakter UTF8 MySQL tidak valid saat mengimpor tabel csv

  2. Pemindaian tidak didukung, menyimpan driver.Tipe nilai []uint8 menjadi tipe *waktu.Waktu

  3. Ketika saya menjalankan program JPA tidak membuat tabel di MySQL

  4. MySQL bergabung dan mengecualikan?

  5. Kesalahan:SQLSTATE[42000]:Kesalahan sintaks atau pelanggaran akses dengan cakePHP