2013-11-25 41 views
1

SQL Server之前2008-12選擇第一和第二條記錄X

我有表:

InteractionKey char(18) 
dEventTime datetime 
SeqNo int 
cEventData1 

將有每InteractionKey多個條目 - dEventTime只出去秒和的SeqNo遞增如果兩個條目在同一秒出現。

我需要做的是選擇第一和第二條記錄的記錄,其中

cEventData1 = 'Disconnect'

最終產品會給我通過cEventData1分組發生計數了。

我目前使用的遊標(將光標源更新暫時),我想用一個CTE

- 但我真的理解他們的鬥爭......

任何想法,將不勝感激!

與數據採集更新

INTERACTIONKEY  dEventTime   SeqNo cEventData1 

100186322420130722 2013-07-22 11:50:49.000  1 EnterPassword 
100186322420130722 2013-07-22 11:50:49.000  2 CheckPassword 
100186322420130722 2013-07-22 11:50:49.000  3 Attendant Disconnect 

查詢將最好告訴我的結果 - :這裏要注意的行動列可以是簡單的「話務員斷開」作爲行動

cEventData1  Action     Count 
CheckPassword Attendant Disconnect  1 

以下是我最終根據以下回答進行的查詢:

SELECT DISTINCT t1.InteractionKey, 
     DisconnectTime = t1.dEventTime, 
     PreviousEventTime = t2.dEventTime, 
     PreviousEvent = t2.cEventData1, 
     t2.SeqNo 
FROM IVRHistory t1 
     OUTER APPLY 
     ( SELECT TOP 1 t2.dEventTime, t2.SeqNo, t2.cEventData1 
      FROM IVRHistory t2 
      WHERE t1.InteractionKey = t2.InteractionKey 
      AND  t1.dEventTime >= t2.dEventTime 
      AND  t1.SeqNo > t2.SeqNo 
      AND  t2.cEventData1 <> 'Attendant Disconnect' 
      ORDER BY t2.dEventTime DESC, t2.SeqNo DESC 
     ) t2 
WHERE t1.cEventData1 = 'Attendant Disconnect' 
+1

您能否給一些模擬數據,你想要什麼的例子嗎? – christiandev

+0

@zimdanen現在看看,謝謝。 – Wjdavis5

回答

1

我會用APPLY接近這樣的:

SELECT t1.InteractionKey, 
     DisconnectTime = t1.dEventTime, 
     PreviousEventTime = t2.dEventTime, 
     PreviousEvent = t2.cEventData1, 
     t2.SeqNo 
FROM T t1 
     OUTER APPLY 
     ( SELECT TOP 2 t2.dEventTime, t2.SeqNo, t2.cEventData1 
      FROM T t2 
      WHERE t1.InteractionKey = t2.InteractionKey 
      AND  t1.dEventTime > t2.dEventTime 
      ORDER BY t2.dEventTime DESC 
     ) t2 
WHERE t1.cEventData1 = 'Disconnect'; 

這會給你兩個記錄緊接前斷開事件。如果您需要兩條以上的記錄,如果有重複次數,您可以使用TOP 2 WITH TIES

沒有你的樣品輸入和輸出我猜了一點,但你所說的最終聚集將是:

SELECT t2.cEventData1, 
     Occurances = COUNT(*) 
FROM T t1 
     OUTER APPLY 
     ( SELECT TOP 2 t2.dEventTime, t2.SeqNo, t2.cEventData1 
      FROM T t2 
      WHERE t1.InteractionKey = t2.InteractionKey 
      AND  t1.dEventTime > t2.dEventTime 
      ORDER BY t2.dEventTime DESC 
     ) t2 
WHERE t1.cEventData1 = 'Disconnect' 
GROUP BY t2.cEventData1; 
+0

首先 - 謝謝!其次,這實際上是給我的第4和第5條記錄 - 我目前正在排除故障。 – Wjdavis5

相關問題