2015-03-25 1 views
1

Допустим, я следующие данные: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) I хотите измерить, как долго каждый билет оставался в отделе (routing_date of successor_department - routing_date департамента предшественника), добавив столбец PROCESSING_TIME:

enter image description here

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

enter image description here

Что SQL заявления необходимо будет сделать это?

спасибо, что заблаговременно!

+0

Вы можете уточнить Total_Processing_Time? Это общее время обработки билета? – Nick

+0

Да, это правильно – royskatt

+0

Чтобы добавить общее время обработки для каждой группы, да SQL необходим. – Ben

ответ

1

Чтобы решить вашу проблему, как вы описали, следующий 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); 
+0

Большое спасибо за это решение. О модели данных, ну, это AS-IS-состояние, на которое я не влияю. Это также специфическая для бизнеса особенность. Кстати, вы используете coalesce вместо nvl, потому что хотите быть ближе к ANSI SQL или есть ли другие причины для этого? – royskatt

+0

Я стараюсь быть совместимым с ANSI, когда это возможно, только потому, что я работаю в среде с несколькими базами данных. – Nick

1

Этот запрос производит желаемый результат. Аналитические функции 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 
+0

Очень приятно, спасибо! – royskatt