Oracle - Расчет разницы во времени

Допустим, у меня есть следующие данные:

Create Table Pm_Test (
Ticket_id Number,
Department_From varchar2(100),
Department_To varchar2(100),
Routing_Date Date
);

Insert Into Pm_Test Values (1,'A','B',To_Date('20140101120005','yyyymmddhh24miss'));
Insert Into Pm_Test Values (1,'B','C',To_Date('20140101130004','yyyymmddhh24miss'));
Insert Into Pm_Test Values (1,'C','D',To_Date('20140101130004','yyyymmddhh24miss'));
Insert Into Pm_Test Values (1,'D','E',To_Date('20140201150004','yyyymmddhh24miss'));
Insert Into Pm_Test Values (2,'A','B',To_Date('20140102120005','yyyymmddhh24miss'));
Insert Into Pm_Test Values (3,'D','B',To_Date('20140102120005','yyyymmddhh24miss'));
Insert Into Pm_Test Values (3,'B','A',To_Date('20140102170005','yyyymmddhh24miss'));

Для следующих требований я уже добавил две виртуальные колонки, думаю, они могут быть необходимы:

Select t.*,
Count(Ticket_id)  Over (Partition By Ticket_id Order By Ticket_id) Cnt_Id,
Row_Number() Over (Partition By Ticket_id Order By Ticket_id ) row_number
From Pm_Test t;

1) Я хочу измерить, как долго каждый билет оставался в отделе (routing_date of successor_department - routing_date предшествующего отдела), добавив столбец PROCESSING_TIME:

2) Я хочу измерить общее время обработки, добавив столбец TOTAL_PROCESSING_TIME:

Какие операторы SQL были бы необходимы для этого?

Заранее большое спасибо!

2 ответа

Решение

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

 select dept.ticket_id, department_from, department_to, routing_date, dept_processing_time, total_ticket_processing_time
from
(select ticket_id, max(routing_date) - min(routing_date) total_ticket_processing_time
from pm_test
group by ticket_id) total
join
(select ticket_id, department_from, department_to, routing_date, 
coalesce(routing_date - lag(routing_date) over (partition by ticket_id order by routing_date), 0) dept_processing_time
from pm_test) dept
on (total.ticket_id = dept.ticket_id);

Этот запрос производит желаемый результат. Аналитические функции max(), min() и lag() используются для расчетов. Результаты в часах, как в вашем вопросе.

SQLFiddle

select t.ticket_id, t.department_from, t.department_to, 
    to_char(t.routing_date, 'mm.dd.yy hh24:mi:ss') rd,
    count(ticket_id)  over (partition by ticket_id) cnt_id,
    row_number() over (partition by ticket_id order by t.routing_date ) rn,
    round(24 * (t.routing_date-
      nvl(lag(t.routing_date) over (partition by ticket_id 
        order by t.routing_date), routing_date) ) , 8) dept_time,
    round(24 * (max(t.routing_date) over (partition by ticket_id) 
      - min(t.routing_date) over (partition by ticket_id)), 8) total_time
  from pm_test t
Другие вопросы по тегам