Mysql
 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 връща за дублираните регистрационни файлове данни същият набор от резултати като SQL Fiddle , където по-ранната заявка се изпълнява срещу данни без дубликати.

Моля, коментирайте, ако и тъй като това изисква корекция / допълнителни подробности.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Презаредете MySQL данни в DIV с помощта на Ajax

  2. Как да покажа схемата на таблица в MySQL база данни?

  3. Синтаксисът на MYSQL, който не се оценява, не е равен на при наличие на NULL

  4. Как да премахнете цифри от края на низа с помощта на SQL

  5. 2 външни ключа, препращащи към един и същ първичен ключ в MySQL