2013-11-25 44 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

相关问题