2012-01-09 69 views
1

我有一个来自IVR的包含唯一呼叫ID,序列号,事件代码和事件描述的表。我想写一个查询,让我知道在特定事件之前事件是什么。任何帮助,将不胜感激。DB2 SQL查询识别在某个特定事件之前发生的事件

+0

您是否需要知道具有相同事件代码的最后一个ID?请更具体的 – 2012-01-09 15:06:29

+0

我只需要知道事件“5047”(无效条目)之前发生了哪些事件代码。所以,不,我不需要知道具有相同事件代码的最后一个ID。它实际上应该是与5047不同的事件代码。 – 2012-01-09 15:16:05

+0

您是否保证'序列号码是(正确)连续的,并且间隙_不会出现? – 2012-01-09 16:53:11

回答

0

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

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并不还需要匹配。如果该假设不正确,则 然后将AND n.call_id = p.call_id添加到联接的ON子句中。

+0

我没有使用BETWEEN,因为它过去(并且可能)会导致比两个有界比较更昂贵的计划。 – 2012-01-09 22:11:09

+0

这工作!感谢Fred!并感谢您添加有关call_id的信息。这很重要。 – 2012-01-10 15:20:52

1

假设你已经是特定事件的“唯一的呼叫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),那么最内部选择可以用该值全部替换。

+0

感谢马特,我不认为这是我正在寻找的。但是,您的回复让我想到了这一点。 SELECT * FROM ËDAILY_EVENTS WHERE = E.SEQUENCE_NUMBER ( SELECT(E.SEQUENCE_NUMBER - 1)AS PRIORSEQUENCE FROM DAILY_EVENTSË WHERE E.EVENT_ID = '5047' AND E.EVENT_DT BETWEEN '01/06/2012 'AND '01/07/2012' )我不确定它是否会起作用,因为此表有时需要几个小时。如果确实有效,我会更新这个问题。 – 2012-01-09 15:57:35

0

假定序列号是连续的(即,下一个记录总是有一个序列号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

+0

Mark,它告诉我“NULL”在使用它的上下文中无效。 – 2012-01-09 17:43:45

+0

这很有趣 - 尝试使用'select 1'代替。 (大多数数据库允许在检查存在时选择“空”;我没有意识到DB2是不同的。) – 2012-01-09 18:36:31

+0

DB2倾向于将NULL转换为特定的数据类型,因此Mark将NULL替换为NULL的假设是1好的举措。 – 2012-01-09 19:13:55

相关问题