Получение времени начала и окончания при изменении статуса в MySQL - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть таблица с устройствами и их состоянием.Каждые 5 минут состояние каждого устройства сохраняется в базе данных.Каждая запись в базе данных содержит имя устройства (ABC, DEF и т. Д.), Состояние устройства (1 = ОК, 6 = вниз и 11 = запланировано вниз), время добавления записи в базу данных идата добавления записи.

Теперь я хотел бы иметь время начала и окончания изменения состояния каждого устройства.

Я использую MySQL версии 5.6.

 CREATE TABLE IF NOT EXISTS `demo` (
    `Id` INT(11) NOT NULL AUTO_INCREMENT,
    `Name` VARCHAR(255) NOT NULL,
    `StateN` INT(11) NOT NULL,
    `TimeAdded` INT(11) NOT NULL,
    `DateAdded` INT(11) NOT NULL,
    PRIMARY KEY (`Id`)
);

INSERT INTO `demo` (`Id`, `Name`, `StateN`, `TimeAdded`, `DateAdded`) VALUES
  (1, 'ABC', 1, 1540250401, 1540245600),
  (2, 'DEF', 1, 1540250401, 1540245600),
  (3, 'GHI', 1, 1540250401, 1540245600),
  (4, 'JKL', 11,1540250401, 1540245600),

  (5, 'ABC', 1, 1540250701, 1540245600),
  (6, 'DEF', 1, 1540250701, 1540245600),
  (7, 'GHI', 1, 1540250701, 1540245600),
  (8, 'JKL', 11, 1540250701, 1540245600),

  (9, 'ABC', 1, 1540251001, 1540245600),
  (10, 'DEF', 1, 1540251001, 1540245600),
  (11, 'GHI', 6, 1540251001, 1540245600),
  (12, 'JKL', 11, 1540251001, 1540245600),

  (13, 'ABC', 1, 1540251301, 1540245600),
  (14, 'DEF', 1, 1540251301, 1540245600),
  (15, 'GHI', 6, 1540251301, 1540245600),
  (16, 'JKL', 11, 1540251301, 1540245600),

  (17, 'ABC', 1, 1540251601, 1540245600),
  (18, 'DEF', 1, 1540251601, 1540245600),
  (19, 'GHI', 1, 1540251601, 1540245600),
  (20, 'JKL', 11,1540251601, 1540245600);

И я хотел бы получить следующий вывод:

Name StateN StartTime  EndTime
ABC  1      1540250401 1540251601
DEF  1      1540250401 1540251601
GHI  1      1540250401 1540250701
GHI  6      1540251001 1540251301
GHI  1      1540251601 1540251601
JKL  11     1540250401 1540251601

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Это возвращает что-то похожее на то, что вы ищете, что заставляет меня подозревать, что в вашем наборе результатов есть ошибка ...

SELECT name
     , staten
     , MIN(timeadded) starttime
     , MAX(timeadded) endtime
  FROM 
     ( SELECT a.* 
         FROM 
            ( SELECT name
                   , staten
                   , timeadded
                   , CASE WHEN @prev_name = name 
                          THEN CASE WHEN @prev_staten = staten 
                                    THEN @i:=@i 
                                    ELSE @i:=@i+1 END 
                          ELSE @i:=@i+1 END i
                   , @prev_name := name prev_name
                   , @prev_staten:=staten prev_state
                FROM demo
               ORDER 
                  BY name
                   , timeadded
                   , staten
            ) a
         JOIN
            ( SELECT @prev_name := null, @prev_staten := null, @i:=0) vars
     ) x
 GROUP
    BY name
     , staten
     , i
 ORDER
    BY name
     , starttime
     , staten;

+------+--------+------------+------------+
| name | staten | starttime  | endtime    |
+------+--------+------------+------------+
| ABC  |      1 | 1540250401 | 1540251601 |
| DEF  |      1 | 1540250401 | 1540251601 |
| GHI  |      1 | 1540250401 | 1540250701 |
| GHI  |      6 | 1540251001 | 1540251301 |
| GHI  |      1 | 1540251601 | 1540251601 |
| JKL  |     11 | 1540250401 | 1540251601 |
+------+--------+------------+------------+
0 голосов
/ 04 декабря 2018

ОБНОВЛЕНИЕ: это неправильный ответ, так как я пропустил часть «при изменении статуса» в ОП.

SELECT
      Name
    , StateN
    , MIN(TimeAdded)
    , MAX(TimeAdded)
FROM
    demo
GROUP BY
    Name, StateN
;
...