如何使用Oracle SQL对记录进行分组并在每组中的第一个记录和最后一个记录之间进行计算?
我在Oracle 10g DB engine中有一个表,其中包含服务操作的记录。要求是计算每个服务请求的处理时间。每个服务请求可以生成多个记录,每个记录表示流程中的一个步骤。因此,我有一个包含以下列的表:如何使用Oracle SQL对记录进行分组并在每组中的第一个记录和最后一个记录之间进行计算?,sql,excel,oracle,Sql,Excel,Oracle,我在Oracle 10g DB engine中有一个表,其中包含服务操作的记录。要求是计算每个服务请求的处理时间。每个服务请求可以生成多个记录,每个记录表示流程中的一个步骤。因此,我有一个包含以下列的表: ID CREATED_ON SERVICE_OPERATION RESULT FK_SERVICE_REQUEST_ID 其中最后一列是服务请求的标识符 如何计算由FK\u服务\u请求\u ID标识的每个组中第一个和最后一个记录的创建的\u之间的差异?我过得更好吗?只要做: SELECT F
ID
CREATED_ON
SERVICE_OPERATION
RESULT
FK_SERVICE_REQUEST_ID
其中最后一列是服务请求的标识符
如何计算由FK\u服务\u请求\u ID
标识的每个组中第一个和最后一个记录的创建的\u之间的差异?我过得更好吗?只要做:
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;
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\u ON
作为订单部分,如果它被任何其他列删除,请更改它。我还使用了FK\u SERVICE\u REQUEST\u ID
列作为组,不知道是该列还是ID
分析功能。
最后一个_值和第一个_值的默认查询窗口范围介于无界的前一行和当前行之间
。在这种情况下,我们要从窗口的第一行检查到最后一行。为了实现这一点,我在当前行和后面的无界行之间添加了范围
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;
这是最大值和最小值,他想要第一个和最后一个@最短和最长日期与第一次和最后一次的日期有什么不同?也许是我的错。最大值和最小值是时间戳中的第一个和最后一个。确定记录顺序以确定第一个和最后一个记录的字段是什么?我们是按Id排序的吗?最小的数字是“第一个”记录,最大的数字是“最后一个”记录?Id应该是相当稳定的。我想不出哪种情况下,具有更晚时间戳的后续步骤将以更低的ID生成。