如何使用Oracle SQL对logging进行分组并在每组之间的第一个和最后一个logging之间进行计算?

我在Oracle 10g数据库引擎中有一个包含服务操作logging的表。 要求是计算每个服务请求的处理时间。 每个服务请求可以生成多个logging,每个logging表示过程中的一个步骤。 所以我有一个表格,内容如下:

ID CREATED_ON SERVICE_OPERATION RESULT FK_SERVICE_REQUEST_ID 

最后一列是服务请求的标识符。

如何计算CREATED_ON所标识的每个组中的第一个和最后一个logging的CREATED_ON之间的差异? 我现在过得好吗?

 SELECT FK_SERVICE_REQUEST_ID, CREATED_ON, SERVICE_OPERATION, RESULT FROM TABLE ORDER BY FK_SERVICE_REQUEST_ID, ID; 

并在Excel中做一些技巧? 如果是这样,我怎样才能在Excel中实现这一点?

 SELECT FK_SERVICE_REQUEST_ID, MIN(CREATED_ON) MIN_DT, MAX(CREATED_ON) MAX_DT, MAX(CREATED_ON)-MIN(CREATED_ON) PROC_TIME FROM TABLE GROUP BY FK_SERVICE_REQUEST_ID ORDER BY FK_SERVICE_REQUEST_ID; 

你可以使用ROW_NUMBER()来做到这一点:

 SELECT s.FK_SERVICE_REQUEST_ID, MAX(CASE WHEN s.asc_rnk = 1 THEN CREATED_ON END) as first_crt_on, MAX(CASE WHEN s.asc_rnk = 1 THEN SERVICE_OPERATION END) as first_srv_op, MAX(CASE WHEN s.desc_rnk = 1 THEN CREATED_ON END) - MAX(CASE WHEN s.asc_rnk = 1 THEN CREATED_ON END) as diff_dates FROM ( SELECT t.*, ROW_NUMBER() OVER(PARTITION BY t.FK_SERVICE_REQUEST_ID BY t.CREATED_ON ) as asc_rnk, ROW_NUMBER() OVER(PARTITION BY t.FK_SERVICE_REQUEST_ID BY t.CREATED_ON DESC) as desc_rnk FROM YourTable t) s GROUP BY s.FK_SERVICE_REQUEST_ID 

我使用CREATED_ON作为订单的一部分,如果它由任何其他列,改变它。 我也使用FK_SERVICE_REQUEST_ID列作为组,不知道它是那个还是ID

分析function。 last_VALUE和FIRST_VALUE具有默认查询窗口RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 。 在这种情况下,我们要检查从窗口的第一行到最后一行。 为了实现它,我已经添加了RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING

 with tabl as ( select 1 FK_SERVICE_REQUEST_ID, sysdate -10 CREATED_ON,1 idn from dual union select 1 FK_SERVICE_REQUEST_ID, sysdate -15 CREATED_ON ,2 from dual union select 1 FK_SERVICE_REQUEST_ID, sysdate -20 CREATED_ON,3 from dual union select 2 FK_SERVICE_REQUEST_ID, sysdate -3 CREATED_ON,4 from dual union select 2 FK_SERVICE_REQUEST_ID, sysdate -5 CREATED_ON,5 from dual union select 2 FK_SERVICE_REQUEST_ID, sysdate -1 CREATED_ON,6 from dual) select FK_SERVICE_REQUEST_ID, min(last_d-first_d) from ( SELECT IDn,FK_SERVICE_REQUEST_ID, CREATED_ON ,FIRST_VALUE(CREATED_ON) OVER (partition by FK_SERVICE_REQUEST_ID ORDER BY CREATED_ON ASC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS first_d ,last_VALUE(CREATED_ON) OVER (partition by FK_SERVICE_REQUEST_ID ORDER BY CREATED_ON ASC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS last_d from tabl) group by FK_SERVICE_REQUEST_ID;