根据不同的列时间戳差异编写oracle DB视图

时间:2014-05-02 10:51:10

标签: sql oracle view

我正在尝试编写一个视图,其中一列是业务逻辑,就像基于接收消息状态的SLA时差。

示例在下面..对于相同的MSG_GUID,我们有不同的PAYLOAD_TYPE,它们代表不同的消息状态,创建的时间显示它在DB中插入的时间。

对于所有消息,

PayloadType = 1将始终位于DB中 在这里,对于相同的消息GUID,我将使用Payload_type = 2或3,但不能同时使用

MSG_GUID             PAYLOAD_TYPE       CREATED_TIME                  
------------------------------------- ------------ ----
5dd222f2175e14       1                   02-MAY-14 04:22:11                       
5dd222f2175e14       2                   02-MAY-14 04:28:11                      
5dd222f2175e14       3                   02-MAY-14

MSG_GUID             PAYLOAD_TYPE       CREATED_TIME                  
------------------------------------- ------------ ----
5dd222f2175e14       1                   02-MAY-14 04:22:11                       
5dd222f2175e14       2                   02-MAY-14                       
5dd222f2175e14       3                   02-MAY-14 04:28:11

现在,在我看来,我必须显示 SLATime,这将是Payload_type 1和2或1和3的时差。 ..这里messageGUID将保持相同...这样我将有100个记录。

有人可以告诉我如何编写SQL查询来实现这一目标。

预期结果 -

如果Payload_type 1和2可用于相同的MSG_GUID,那么

SLATime
-----------
0 HOURS 6 MINUTES 0 SECS (created time difference of Payload_type 1 and 2 row)

但是如果Payload_type 1和3可用于相同的MSG_GUID那么

SLATime
-----------
0 HOURS 6 MINUTES 0 SECS (created time difference of Payload_type 1 and 3 row)

1 个答案:

答案 0 :(得分:0)

如果你想要与没有时间组件的created_time不同,那么你需要这样的逻辑:

select msg_guid,
       (max(case when payload_type = 1 then created_time end) -
        (case when max(case when payload_type = 2 then created_time end) <>
                   trunc(max(case when payload_type = 2 then created_time end))
              then max(case when payload_type = 2 then created_time end) 
              when max(case when payload_type = 3 then created_time end) <>
                   trunc(max(case when payload_type = 3 then created_time end))
              then max(case when payload_type = 3 then created_time end) 
        end)
        ) as diff              
from table t
group by msg_guid;

这会将结果作为一天的分数返回。