PL SQL在一段时间内查找重复事件

时间:2014-11-14 15:51:03

标签: sql oracle plsql common-table-expression window-functions

提前致谢。

我有一个包含以下架构的表

CallNotes (
Policy    VARCHAR2(15 BYTE)
Notes_TS  TIMESTAMP(6)
UserId    VARCHAR2(50 BYTE)
)

此表的粒度是呼叫中发生的每个事件的记录。要识别重复呼叫,我需要查找具有相同策略的下一个时间戳,但是在未来10分钟到7天之间发生不同的用户ID。 7天后发生的任何事情都是一个新的电话。

可以使用新的note_ts重复Policy和UserID,例如:

Policy   |Notes_TS                 |UserId
123abc   |2014-11-14 10:10:05.000  |joe
123abc   |2014-11-14 10:11:32.000  |joe
123abc   |2014-11-14 10:11:55.000  |joe
156def   |2014-11-14 10:15:16.000  |julie
123abc   |2014-11-14 10:23:42.000  |jane

因此,123abc两次调用,因为它是一个重复的策略,其中不同的用户ID将来超过10分钟。

我打算使用CTE和窗口函数来实现这一目标,但我无法完成第一步。

我的查询看起来像这样,我尝试了分区的变体,但是,我只是没有考虑到这个问题。

With orderedCalls as 
    ( Select 
        Policy,
        UserId,
        Notes_TS NewCallTime,
        lag(Notes_TS,1,'01-JAN-1900') over (partition by Policy, UserId order by Notes_TS) prev_ts,
        lead(Notes_TS,1,'01-JAN-1900') over (partition by Policy, UserId order by Notes_TS) prev_ts
        row_number() over(partition by Policy order by Notes_ts) "Order"
      From CallHistory),
  RepeatCalls as 
    (.....

我也在考虑通过策略和策略,userid以及使用它来获取行排序。

感谢。

1 个答案:

答案 0 :(得分:0)

您可以使用lag()功能获取有关上一次通话时间戳的信息:

select cn.*,
       (case when prev_userid <> userid and
                  notes_ts - prev_ts between '+00 00:10:00' and '+07 00:00:00'
              then 1 else 0 end) as IsRepeat
from (select cn.*,
             lag(Notes_ts) over (partition by Policy order by Notes_ts) as prev_ts,
             lag(userid) over (partition by Policy order by Notes_ts) as prev_userid
      from CallNotes cn
     ) cn;