create table kk_log (id number, lc_date date, lc_message varchar2(200));
insert into kk_log (id,lc_date,lc_message) values (1,to_date('27.06.2012 0:55:47','dd.mm.yyyy hh24:mi:ss'), 'start Pump_Pers_PercStav2');
insert into kk_log (id,lc_date,lc_message) values (2,to_date('27.06.2012 1:56:00','dd.mm.yyyy hh24:mi:ss'), 'start Fill_depfis_pays');
insert into kk_log (id,lc_date,lc_message) values (3,to_date('27.06.2012 1:56:12','dd.mm.yyyy hh24:mi:ss'), 'finish Pump_Pers_PercStav2');
insert into kk_log (id,lc_date,lc_message) values (4,to_date('27.06.2012 1:56:28','dd.mm.yyyy hh24:mi:ss'), 'finish Fill_depfis_pays');
insert into kk_log (id,lc_date,lc_message) values (5,to_date('27.06.2012 8:06:39','dd.mm.yyyy hh24:mi:ss'), 'start Failing_process_which_not_finishes');
insert into kk_log (id,lc_date,lc_message) values (6,to_date('27.06.2012 9:02:33','dd.mm.yyyy hh24:mi:ss'), 'start Pump_Prep_PersLim');
insert into kk_log (id,lc_date,lc_message) values (7,to_date('27.06.2012 9:03:44','dd.mm.yyyy hh24:mi:ss'), 'start Fill_depfis_pays');
insert into kk_log (id,lc_date,lc_message) values (8,to_date('27.06.2012 9:04:07','dd.mm.yyyy hh24:mi:ss'), 'finish Fill_depfis_pays');
insert into kk_log (id,lc_date,lc_message) values (9,to_date('27.06.2012 9:04:07','dd.mm.yyyy hh24:mi:ss'), 'start Fill_depfis_pays');
insert into kk_log (id,lc_date,lc_message) values (10,to_date('27.06.2012 9:04:07','dd.mm.yyyy hh24:mi:ss'), 'finish Fill_depfis_pays');
insert into kk_log (id,lc_date,lc_message) values (11,to_date('27.06.2012 9:04:07','dd.mm.yyyy hh24:mi:ss'), 'start Pump_Pers_PercStav2');
insert into kk_log (id,lc_date,lc_message) values (12,to_date('27.06.2012 9:06:19','dd.mm.yyyy hh24:mi:ss'), 'finish Pump_Prep_PersLim');
insert into kk_log (id,lc_date,lc_message) values (13,to_date('27.06.2012 9:56:16','dd.mm.yyyy hh24:mi:ss'), 'start Failing_process_which_not_finishes');
insert into kk_log (id,lc_date,lc_message) values (14,to_date('27.06.2012 10:11:54','dd.mm.yyyy hh24:mi:ss'), 'finish Pump_Pers_PercStav2');
insert into kk_log (id,lc_date,lc_message) values (15,to_date('27.06.2012 11:08:41','dd.mm.yyyy hh24:mi:ss'), 'start Pump_cats');
Запросом нужно получить такой результат:
PROC_NAME
START_DATE
FINISH_DATE
RUN_TIME_IN_SECONDS
Pump_Pers_PercStav2
27.06.2012 0:55:47
27.06.2012 1:56:12
Fill_depfis_pays
27.06.2012 1:56:00
27.06.2012 1:56:28
Failing_process_which_not_finishes
27.06.2012 8:06:39
Pump_Prep_PersLim
27.06.2012 9:02:33
27.06.2012 9:06:19
Fill_depfis_pays
27.06.2012 9:03:44
27.06.2012 9:04:07
Fill_depfis_pays
27.06.2012 9:04:07
27.06.2012 9:04:07
Pump_Pers_PercStav2
27.06.2012 9:04:07
27.06.2012 10:11:54
Failing_process_which_not_finishes
27.06.2012 9:56:16
Pump_cats
27.06.2012 11:08:41
В подзапросе q1 вычленим из лога название процесса и индикатор начала или окончания процесса (0 или 1 соответственно).
В подзапросе q2 с помощью функции lead найдем для каждой записи о процессе следующую запись, сортируя данные по id. Здесь же вычисляем lead_indicator, чтобы особо учесть случаи, когда после start идет не finish, а снова start (например, потому, что процесс не завершился успешно и был запущен повторно).
Наконец, во внешнем запросе отсечем записи по условию indicator = 0 и вычислим время выполнения каждого процесса в секундах: