Нахождение промежутка даты между двумя таймфреймами - PullRequest
0 голосов
/ 14 ноября 2018

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

Диаграмма Ганта для иллюстрации моей задачи:

enter image description here

Структура таблицы с примерами

+-----------+------+-------+---------------------+---------------------+-----------+
| Equipment | Type | State |    Tracked_inTIME   |   Tracked_outTIME   | Load_Type |  
+-----------+------+-------+---------------------+---------------------+-----------+
| A1        | MACH | UP    | 2018-11-13 08:00:00 | 2018-11-13 10:00:00 | NULL      |  
| A1        | LOAD | NULL  | 2018-11-13 08:20:00 | 2018-11-13 09:43:00 | PROD      |  
| A1        | LOAD | NULL  | 2018-11-13 08:22:30 | 2018-11-13 09:55:00 | PROD      |  
| A1        | LOAD | NULL  | 2018-11-13 08:30:00 | 2018-11-13 10:11:00 | PROD      | 
| A1        | MACH | DOWN  | 2018-11-13 10:00:00 | 2018-11-13 10:35:00 | NULL      |  
| A1        | MACH | UP    | 2018-11-13 10:35:00 | 2018-11-13 15:11:00 | NULL      |  
| A1        | LOAD | NULL  | 2018-11-13 11:00:00 | 2018-11-13 11:51:00 | PROD      |  
| A1        | LOAD | NULL  | 2018-11-13 11:25:00 | 2018-11-13 11:55:00 | PROD      |  
| A1        | LOAD | NULL  | 2018-11-13 12:05:00 | 2018-11-13 14:11:00 | PROD      |  
| A1        | LOAD | NULL  | 2018-11-13 12:25:00 | 2018-11-13 13:05:00 | PROD      |  
| A1        | LOAD | NULL  | 2018-11-13 13:45:00 | 2018-11-13 15:11:00 | PROD      |  
| A2        | MACH | UP    | 2018-11-13 08:00:00 | 2018-11-13 14:05:00 | NULL      |  
| A2        | LOAD | NULL  | 2018-11-13 08:00:00 | 2018-11-13 14:05:00 | PROD      | 
+-----------+------+-------+---------------------+---------------------+-----------+

Неверный вывод (столбец: Gapduration = 40, должно быть 0, так как машина все еще работает с нагрузкой)

    +----+-------+---------------------+---------------------+---------------------+----------------------+-------------+
    | EQ | State |      EQ_inTIME      |     EQ_outTIME      |     LOAD_inTIME     |     LOAD_outTIME     | GapDuration |
    +----+-------+---------------------+---------------------+---------------------+----------------------+-------------+
    | A1 | UP    | 2018-11-13 08:00:00 | 2018-11-13 10:00:00 | 2018-11-13 08:20:00 |  2018-11-13 09:43:00 |          20 |
    | A1 | UP    | 2018-11-13 08:00:00 | 2018-11-13 10:00:00 | 2018-11-13 08:22:30 |  2018-11-13 09:55:00 |           0 |
    | A1 | UP    | 2018-11-13 08:00:00 | 2018-11-13 10:00:00 | 2018-11-13 08:30:00 |  2018-11-13 10:11:00 |           0 |
    | A1 | DOWN  | 2018-11-13 10:00:00 | 2018-11-13 10:35:00 | 2018-11-13 08:30:00 |  2018-11-13 10:11:00 |           0 |
    | A1 | UP    | 2018-11-13 10:35:00 | 2018-11-13 15:11:00 | 2018-11-13 11:00:00 |  2018-11-13 11:51:00 |          25 |
    | A1 | UP    | 2018-11-13 10:35:00 | 2018-11-13 15:11:00 | 2018-11-13 11:25:00 |  2018-11-13 11:55:00 |           0 |
    | A1 | UP    | 2018-11-13 10:35:00 | 2018-11-13 15:11:00 | 2018-11-13 12:05:00 | *2018-11-13 14:11:00 |          10 |
    | A1 | UP    | 2018-11-13 10:35:00 | 2018-11-13 15:11:00 | 2018-11-13 12:25:00 |  2018-11-13 13:05:00 |           0 |
    | A1 | UP    | 2018-11-13 10:35:00 | 2018-11-13 15:11:00 | 2018-11-13 13:45:00 |  2018-11-13 15:11:00 |          40 |
    | A2 | UP    | 2018-11-13 08:00:00 | 2018-11-13 14:05:00 | 2018-11-13 08:00:00 |  2018-11-13 14:05:00 |           0 |
    +----+-------+---------------------+---------------------+---------------------+----------------------+-------------+
  • Выход был получен путем самостоятельного соединения, чтобы привязать временной интервал загрузки к состоянию оборудования.
  • Load_inTIME в первой строке каждого изменения состояния оборудования сравнивается с equipment_inTIME
  • Последующие строки load_inTIME сравниваются с предыдущим load_outTIME с использованием функции lag ()

  • Основная проблема, с которой я столкнулся, заключалась в том, что имелся период загрузки (помеченный *), который охватывает многократную продолжительность загрузки, которую мои вычисления не смогли учесть

Есть предложения?

1 Ответ

0 голосов
/ 15 ноября 2018

Почти ответил слишком быстро. Извините, если другой ответ получится. Я не видел ваши комментарии ниже 2-й таблицы.

Так, я думаю, вам нужно немного изменить свою таблицу, не для того, чтобы изменить ее, но чтобы получить временный набор данных для работы (CTE / временная таблица / и т.д ...). Вам нужно, чтобы ваши данные отображали то, что вы видите на графике, в отношении больших черных линий, которые охватывают верхнюю и нижнюю части шкалы времени как нагрузки, так и мах.

По сути, вы должны представить одну непрерывную серию времени. Это то, что просят большие черные линии. Когда пуск / остановка нагрузки, эти времена должны совпадать с временем вашего подъема / спада. Для каждой записи вы сравниваете текущие записи "Tracked_outTIME" со следующими записями (ведущая функция) "Tracked_inTIME". Если>, тогда закончите текущее время записи "out" временем следующих записей "in" time и создайте флаг, чтобы сказать "is_loaded". Вы будете использовать это в следующем / последнем запросе, чтобы запросить новую таблицу временных последовательностей, чтобы получить ваш дата при переходе от is_loaded = 1 к is_loaded = 0 или наоборот.

Итак, ваши первые записи "вверх" не должны быть равны 10, а должны заканчиваться в 8:20, когда начинается загрузка .... и так далее, и так далее, чтобы создать новую / временную таблицу. затем запросите эту таблицу.

...