Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle-计算时间差_Sql_Oracle_Aggregation_Analytic Functions - Fatal编程技术网

Sql Oracle-计算时间差

Sql Oracle-计算时间差,sql,oracle,aggregation,analytic-functions,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

假设我有以下数据:

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来测量每张票在一个部门停留的时间(继任者部门的routing_date-前任部门的routing_date):

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

这样做需要哪些SQL语句


提前非常感谢

要解决您的问题,按照您描述的方式,下面的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()。 结果以小时为单位,就像你的问题一样


你能说明总的处理时间吗?是票证处理的总时间吗?是的,这是正确的为了增加每个组的总处理时间,是的SQL是必要的。@Ben:我猜是的,我只是不知道会是什么SQL语句。这就是我在这里发布这个问题的原因。对于第一部分,您应该研究滞后/超前分析函数。对于第二种情况,您需要将时间相加,或者从每组的最小日期中减去最大日期。非常感谢您提供的解决方案。关于数据模型,这是我不影响的现状。这也是企业特有的特点。顺便说一句,你使用coalesce而不是nvl是因为你想更接近ansisql,还是有其他原因?我尽可能做到符合ANSI标准,只是因为我在多数据库环境中工作。
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