Oracle SQL LAG函数及时返回错误的计算
我在第一行的计算列不同时间是不正确的数据,第二行是正确的数据,直到第10行再次是不正确的数据,然后下一行使用滞后函数再次返回到正确的计算。如果有人能在这个问题上帮助我,我将不胜感激。谢谢 [![这是数据样本][1][1] 以下是我的问题:Oracle SQL LAG函数及时返回错误的计算,oracle,oracle-sqldeveloper,lag,partition-by,Oracle,Oracle Sqldeveloper,Lag,Partition By,我在第一行的计算列不同时间是不正确的数据,第二行是正确的数据,直到第10行再次是不正确的数据,然后下一行使用滞后函数再次返回到正确的计算。如果有人能在这个问题上帮助我,我将不胜感激。谢谢 [![这是数据样本][1][1] 以下是我的问题: select EQP_ID,LOT_ID,ACTIVITY,DATE_TIME TO_CHAR (DATE '1900-01-01' + ABS ( LAG(DATE_TIME,1)OVER(PARTITION BY EQP_ID ORDER BY DATE_
select EQP_ID,LOT_ID,ACTIVITY,DATE_TIME
TO_CHAR (DATE '1900-01-01' + ABS ( LAG(DATE_TIME,1)OVER(PARTITION BY EQP_ID ORDER BY DATE_TIME) - DATE_TIME), 'HH24:MI:SS')AS Different_Time
from STG_RMSTMP_CJ.ota_activity where EQP_ID = '93K-P007'
这是输出结果:
[1] :
你的第一个逻辑很好。你也应该考虑白天的差异。但是,为了给你提供你想要的解决方案,请尝试下面的方法
您的查询很好,但您只需要格式化处理天数、小时数 我也为你做了同样的事情:
请您添加输入数据而不是图像,Lag还有默认值参数,可以在Null的情况下使用。您想在第10行看到什么结果@YongHi ismetguzelgun,第10行中的(不同的时间列)计算不是正确的数据,应该是15:42:44-10:28:18=05:14:26,对吗?谢谢在这种情况下,你的第二行肯定也错了,对吗@YongHi ismetguzelgun,嗯,是的,但是从第三行开始,数据是正确的。Hi ismetguzelgun,它返回我不正确的数据。Hi ismetguzelgun,只有第二行在第3行之后返回正确的值,直到第11行不是正确的值。Hi ismetguzelgun,我已经尝试过这个方法,从第二行时间到第一行时间的平均分块。谢谢你的解决方案。非常感激。你能考虑给予一个赞成票吗?@勇
EQP_ID LOT_ID ACTIVITY DATE_TIME Different_Time
93K-P007 GC00495 LOAD_LOT 2020-08-03 16:48:48 NULL
93K-P007 GC00495 LOAD_LOT 2020-08-05 11:51:44 19:02:56
93K-P007 GC00495 LOAD_LOT 2020-08-05 11:57:24 00:05:40
93K-P007 GC00495 LOAD_LOT 2020-08-05 15:14:21 03:16:57
93K-P007 WD72120 LOAD_LOT 2020-08-05 15:17:17 00:02:56
93K-P007 GC00495 LOAD_LOT 2020-08-05 15:28:43 00:11:26
93K-P007 GC00495 LOAD_LOT 2020-08-05 15:30:00 00:01:17
93K-P007 GC00495 LOAD_LOT 2020-08-05 15:42:44 00:12:44
93K-P007 GC00495 LOAD_LOT 2020-08-07 10:28:18 18:45:34
93K-P007 GC00495 LOAD_LOT 2020-08-07 10:33:31 00:05:13
WITH MAIN
AS (SELECT '93K-P007' AS EQP_ID,
'GC00495' LOT_ID,
'LOAD_LOT' ACTIVITY,
TO_DATE ('2020-08-03 16:48:48', 'YYYY-MM-DD HH24:MI:SS')
AS DATE_TIME
FROM DUAL
UNION ALL
SELECT '93K-P007' AS EQP_ID,
'GC00495' LOT_ID,
'LOAD_LOT' ACTIVITY,
TO_DATE ('2020-08-05 11:51:44', 'YYYY-MM-DD HH24:MI:SS')
AS DATE_TIME
FROM DUAL
UNION ALL
SELECT '93K-P007' AS EQP_ID,
'GC00495' LOT_ID,
'LOAD_LOT' ACTIVITY,
TO_DATE ('2020-08-05 11:57:24', 'YYYY-MM-DD HH24:MI:SS')
AS DATE_TIME
FROM DUAL
UNION ALL
SELECT '93K-P007' AS EQP_ID,
'GC00495' LOT_ID,
'LOAD_LOT' ACTIVITY,
TO_DATE ('2020-08-05 15:14:21', 'YYYY-MM-DD HH24:MI:SS')
AS DATE_TIME
FROM DUAL
UNION ALL
SELECT '93K-P007' AS EQP_ID,
'WD72120' LOT_ID,
'LOAD_LOT' ACTIVITY,
TO_DATE ('2020-08-05 15:17:17', 'YYYY-MM-DD HH24:MI:SS')
AS DATE_TIME
FROM DUAL
UNION ALL
SELECT '93K-P007' AS EQP_ID,
'GC00495' LOT_ID,
'LOAD_LOT' ACTIVITY,
TO_DATE ('2020-08-05 15:28:43', 'YYYY-MM-DD HH24:MI:SS')
AS DATE_TIME
FROM DUAL
UNION ALL
SELECT '93K-P007' AS EQP_ID,
'GC00495' LOT_ID,
'LOAD_LOT' ACTIVITY,
TO_DATE ('2020-08-05 15:30:00', 'YYYY-MM-DD HH24:MI:SS')
AS DATE_TIME
FROM DUAL
UNION ALL
SELECT '93K-P007' AS EQP_ID,
'GC00495' LOT_ID,
'LOAD_LOT' ACTIVITY,
TO_DATE ('2020-08-05 15:42:44', 'YYYY-MM-DD HH24:MI:SS')
AS DATE_TIME
FROM DUAL
UNION ALL
SELECT '93K-P007' AS EQP_ID,
'GC00495' LOT_ID,
'LOAD_LOT' ACTIVITY,
TO_DATE ('2020-08-07 10:28:18', 'YYYY-MM-DD HH24:MI:SS')
AS DATE_TIME
FROM DUAL
UNION ALL
SELECT '93K-P007' AS EQP_ID,
'GC00495' LOT_ID,
'LOAD_LOT' ACTIVITY,
TO_DATE ('2020-08-07 10:33:31', 'YYYY-MM-DD HH24:MI:SS')
AS DATE_TIME
FROM DUAL)
SELECT EQP_ID,
LOT_ID,
ACTIVITY,
DATE_TIME,
TO_CHAR(
LPAD(ABS(EXTRACT(HOUR FROM TO_TIMESTAMP(TO_CHAR(LAG (DATE_TIME, 1 ,DATE_TIME)OVER (PARTITION BY EQP_ID ORDER BY DATE_TIME),'yyyy-mm-dd HH24:MI:SS'),'yyyy-mm-dd HH24:MI:SS')) -
EXTRACT(HOUR FROM TO_TIMESTAMP(TO_CHAR(DATE_TIME,'yyyy-mm-dd HH24:MI:SS'),'yyyy-mm-dd HH24:MI:SS'))) ,2,'0')||':'||
LPAD(ABS(EXTRACT(MINUTE FROM TO_TIMESTAMP(TO_CHAR(LAG (DATE_TIME, 1 ,DATE_TIME)OVER (PARTITION BY EQP_ID ORDER BY DATE_TIME),'yyyy-mm-dd HH24:MI:SS'),'yyyy-mm-dd HH24:MI:SS')) -
EXTRACT(MINUTE FROM TO_TIMESTAMP(TO_CHAR(DATE_TIME,'yyyy-mm-dd HH24:MI:SS'),'yyyy-mm-dd HH24:MI:SS'))) ,2,'0')||':'||
LPAD(ABS(EXTRACT(SECOND FROM TO_TIMESTAMP(TO_CHAR(LAG (DATE_TIME, 1 ,DATE_TIME)OVER (PARTITION BY EQP_ID ORDER BY DATE_TIME),'yyyy-mm-dd HH24:MI:SS'),'yyyy-mm-dd HH24:MI:SS')) -
EXTRACT(SECOND FROM TO_TIMESTAMP(TO_CHAR(DATE_TIME,'yyyy-mm-dd HH24:MI:SS'),'yyyy-mm-dd HH24:MI:SS'))),2,'0')
) AS DIFF
FROM MAIN
WHERE EQP_ID = '93K-P007'
select EQP_ID,LOT_ID,ACTIVITY,DATE_TIME, abs(extract (DAY from Different_Time))||' '||abs(extract (HOUR from Different_Time))||':'||abs(extract (MINUTE from Different_Time))||':'||abs(extract (SECOND from Different_Time)) AS Different_Time from (
select EQP_ID,LOT_ID,ACTIVITY,DATE_TIME,
LAG(DATE_TIME,1) OVER(PARTITION BY EQP_ID ORDER BY DATE_TIME) - DATE_TIME AS Different_Time
from table1 where EQP_ID = '93K-P007');