Рассчитать время перекрытия для нескольких записей - PullRequest
1 голос
/ 20 января 2020

Я хотел бы рассчитать время перекрытия для нескольких записей. Я пытаюсь сделать это, используя аналитическую оконную функцию, но теперь застрял.

Набор данных:

ID  FY  WK  Group   StartDate   StartTime   EndTime Category    Dur Overlap
1   19  49  H-IS02  2019/06/03  22:35:00    23:25:00    MBA2    50  00:00:00
2   19  49  H-IS02  2019/06/04  09:40:00    09:55:00    MBD2    15  00:00:00
3   19  49  H-IS02  2019/06/04  10:30:00    10:55:00    MBD2    25  00:00:00
4   19  49  H-IS02  2019/06/04  13:50:00    14:30:00    MBD2    40  00:00:00
5   19  49  H-IS02  2019/06/04  14:05:00    15:15:00    MBD2    70  00:25:00
6   19  49  H-IS02  2019/06/04  19:30:00    01:20:00    MBA2    350 00:00:00
7   19  49  H-IS02  2019/06/06  08:45:00    09:30:00    MBD2    45  00:00:00
8   19  49  H-IS02  2019/06/06  17:30:00    21:40:00    MBA2    250 00:00:00
9   19  49  H-IS02  2019/06/06  19:30:00    20:10:00    MBA2    40  02:10:00
10  19  49  H-IS02  2019/06/07  00:00:00    01:20:00    MBA2    80  00:00:00
11  19  49  H-IS02  2019/06/07  08:30:00    09:20:00    MBD2    50  00:00:00
12  19  49  H-IS02  2019/06/07  09:20:00    16:20:00    MBD2    420 00:00:00
13  19  49  H-IS02  2019/06/07  13:30:00    13:46:00    MBD2    16  02:50:00
14  19  49  H-IS02  2019/06/07  16:06:00    16:20:00    MBD2    14  00:00:00
15  19  49  H-IS02  2019/06/07  17:45:00    23:00:00    MBA2    455 00:00:00
16  19  49  H-IS02  2019/06/07  20:30:00    21:20:00    MBA2    50  00:50:00
17  19  49  H-IS02  2019/06/07  22:30:00    22:45:00    MBA2    15  00:15:00
18  19  49  H-IS02  2019/06/07  23:00:00    23:15:00    MBA2    15  00:00:00

Я установил раздел (Group, StartDate, Category) и хочу рассчитать перекрытие EndTime к StartTime предыдущей записи, ЕСЛИ он принадлежит к тому же набору данных: StartDate, Group, Category.

Длительность (Dur) рассчитывается нормально, но мне также нужно знать перекрывающиеся минуты для записей в одном наборе данных. Запись 5 в приведенных выше данных имеет начальное время раньше, чем конечное время для записи 4, и она принадлежит тому же разделу.

Логика расчета c объяснено

I ' Буду признателен за любые рекомендации о том, как подойти к этому расчету.

Еще несколько подробностей задачи: данные для оборудования на заводе. Каждая запись содержит информацию о простоях. Я хочу рассчитать продолжительность, в течение которой машина перекрывала время простоя другой машины. Две машины могли быть выключены одновременно - с точным запуском и окончанием sh раз. Таким образом, если их время простоя составляло час, то у меня общее время простоя составляло 2 часа, а эффективное время простоя составляло всего 1 час. Вычисляя перекрытие времени простоя между машинами, я также могу определить ЭФФЕКТИВНОЕ ВРЕМЯ ВРЕМЕНИ как ВСЕГО ВРЕМЕНИ - ПЕРЕКРЫТИЕ

Сначала я подошел к этой проблеме, используя раздел, но не думаю, что это решит мою проблему. Проблема, которую я вижу, состоит в том, что у меня может быть, например, 4 записи, которые следует проверить на совпадение. Запись 2 является перекрытием записи 1. Запись 3 ничего не перекрывает и запись 4 перекрывает запись 1. Если смещение всегда было 1 или n записей, я мог бы использовать функцию LAG.

Мой текущий оператор SELECT ниже. И это не дает мне теплого чувства ... Это создает дополнительные записи в наборе результатов.

    select DT.fiscalyear, DT.productionweek, DT.group, DT.plantsection, DT.startdate, DT.category,OL.endtime,OL.starttime, 
dt.endtime,DT.starttime, dt.endtime - DT.starttime as Overlap 
from (
select DT.fiscalyear, DT.productionweek, DT.group, DT.PlantSection, DT.StartDate, DT.starttime,dt.MaintenancePlant, 
        DT.EndDate, DT.endtime, DT.category, DT.breakdownduration 
from Labs_Engineering.BV_MOR_Mining_AllDowntime DT) DT

join (
select TEST.startdate, PlantSection,category, max(endtime) endtime, max(starttime) starttime
from Labs_Engineering.BV_MOR_Mining_AllDowntime Test
where productionweek = 49 and fiscalyear = 19
and MaintenancePlant = 9804
and group = 'H-IS02'
and category like 'MBA2'
and (PlantSection ='P33' or PlantSection = 'P34')
group by PlantSection,category,startdate
--where DT.endtime <= Test.starttime
) OL
on DT.StartDate = OL.StartDate
and DT.PlantSection = OL.PlantSection
and DT.category = OL.category
where DT.starttime <= OL.endtime and ol.starttime > dt.starttime;
...