Oracle - 计算时差

时间:2015-03-25 16:27:31

标签: sql oracle aggregation analytic-functions

假设我有以下数据:

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)我想通过添加列PROCESSING_TIME来衡量每张票在一个部门(successor_department的routing_date - 前任部门的routing_date)中停留的时间:

enter image description here

2)我想通过添加列TOTAL_PROCESSING_TIME来测量总处理时间:

enter image description here

这样做需要哪些SQL语句?

非常感谢你!

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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