【问题标题】:Oracle - Calculating time differencesOracle - 计算时差
【发布时间】:2015-05-29 10:49:03
【问题描述】:

假设我有以下数据:

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 列来衡量每张工单在部门中停留的时间(后继部门的路由日期 - 前任部门的路由日期):

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

这样做需要哪些 SQL 语句?

非常感谢您!

【问题讨论】:

  • 你能澄清一下 Total_Processing_Time 吗?这是处理工单的总时间吗?
  • 是的,没错
  • 为了增加每个组的总处理时间,是的,SQL 是必要的。
  • @Ben:猜到了,我只是不知道那会是什么 SQL 语句。这就是我在这里发布这个问题的原因。
  • 对于第一部分,您应该研究滞后/领先分析函数。对于第二个,您需要对时间求和,或者从每个组的最小日期中减去最大日期。

标签: sql oracle aggregation analytic-functions


【解决方案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);

【讨论】:

  • 非常感谢您提供的解决方案。关于数据模型,嗯,它是我无法影响的 AS-IS 状态。这也是业务特有的特性。顺便说一句,您使用 coalesce 而不是 nvl 是因为您想更接近 ANSI SQL,还是有其他原因?
  • 我尽量符合 ANSI 标准,因为我在多数据库环境中工作。
【解决方案2】:

此查询产生所需的输出。用于计算的分析函数 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

【讨论】:

    猜你喜欢
    • 2017-04-21
    • 1970-01-01
    • 2013-09-05
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多