2012-01-09 93 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

相關問題