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