Объедините идентичные строки с соседними периодами business_time в темпоральных таблицах DB2.

У меня есть временная таблица DB2 с business_time PERIOD, которая выглядит так:

      id local_unit vehicle      start        end
   12389       3538   21147 2019-01-01 2019-07-01
   12389       3538   21147 2019-07-01 2019-12-31

Я хотел бы изменить таблицу и объединить строки, подобные приведенным выше, где все значения идентичны, а периоды бизнес-времени являются смежными. Результат должен выглядеть так:

      id local_unit vehicle      start        end
   12389       3538   21147 2019-01-01 2019-12-31

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


person Stefan F    schedule 19.08.2020    source источник
comment
Почему вы хотите это сделать? С точки зрения функциональности при использовании временного SQL нет никакой разницы.   -  person MichaelTiefenbacher    schedule 19.08.2020
comment
только за перфекционизм; меня раздражает наличие ненужных строк, но для того, чтобы избежать их в логике моего приложения, потребуется очень неуклюжий код. Я надеялся, что будет элегантное решение для SQL, чтобы время от времени очищать таблицы.   -  person Stefan F    schedule 19.08.2020


Ответы (1)


Это проблема пробелов и островов. Как уже говорилось, вы можете использовать lag() и накопительную сумму:

select id, local_unit, vehicle, min(start), max(end)
from (select t.*,
             sum(case when prev_end >= start then 0 else 1 end) over 
                 (partition by id, local_unit, vehicle order by start) as grp
      from (select t.*,
                   lag(end) over (partition by id, local_unit, vehicle order by start) as prev_end
            from t
           ) t
     ) t
group by id, local_unit, vehicle, grp;

lag() находит предыдущее время окончания. sum() подсчитывает, сколько раз нет перекрытия — это начало острова. Окончательная логика просто агрегирует значения.

person Gordon Linoff    schedule 19.08.2020
comment
Благодарность! это отличный ввод, однако я хочу изменить существующую таблицу, а не просто выбрать из нее... конечно, я мог бы сделать что-то хакерское через временную таблицу, но я хочу попытаться избежать этого - person Stefan F; 19.08.2020