DB2 SQL查询,用于识别序列中特定事件之前发生的事件

  • 本文关键字:事件 查询 SQL 用于 识别 DB2 sql db2
  • 更新时间 :
  • 英文 :


IVR中有一个表,其中包含唯一的调用id、序列号、事件代码和事件描述。我想写一个查询,让我知道在特定事件之前的事件是什么。

假设您所拥有的只是特定事件的"唯一调用id":

SELECT *
FROM tbl
WHERE sequence_number = (
    SELECT MAX(sequence_number)
    FROM tbl
    WHERE sequence_number = (
        SELECT sequence_number FROM tbl WHERE unique_id = PARTICULAR_EVENT_UNIQUE_ID
    )
);

如果特定事件的序列号是已知的(代替或除了唯一的调用id之外),那么最内部的选择可以全部替换为该值。

根据表上存在的索引,直接的内部联接可能会从查询优化器获得性能更好的访问计划。

SELECT n.call_id, 
    n.event_dt, 
    n.sequence_number, 
    p.call_id as prior_call_id, 
    p.event_id as prior_event_id,
    p.event_dt as prior_event_dt,
    p.sequence_number as prior_sequence_number
FROM daily_events n
INNER JOIN daily_events p
    ON p.sequence_number = n.sequence_number - 1
WHERE n.event_id = '5047'
AND n.event_dt >= DATE( '01/06/2012' ) 
AND n.event_dt <= DATE( '01/07/2012' );

查询假设序列号相差一的任何事件都是适当的匹配,并且call_id也不需要匹配。如果该假设是不正确的,则将CCD_ 1添加到联接的ON子句中。

假设序列号是连续的(即下一条记录的序列号总是比当前记录大1),请尝试:

select i.* 
from ivr_table i
where exists
(select 1
 from ivr_table ni
 where i.sequence + 1 = ni.sequence and ni.event_code = '5047')

编辑:子查询中的select null替换为select 1

最新更新