对记录进行计数和分组,直至达到某个值

时间:2014-08-15 09:33:44

标签: sql-server tsql sql-server-2008-r2

我的MS SQL2008R2服务器上有一个包含历史电话呼叫数据的表,其中包含记录ID,时间戳以及呼叫是否已连接的布尔指示符。

我想确定每个记录的通话次数,包括第一个"连接记录"。例如,对于记录ID ABC123

  • 对记录进行了5次调用
  • 前两个没有连接
  • 第三次和第四次通话已连接
  • 第五个没有连接

..输出将是

  RecordID    CallsUntilSuccessful
  ABC123           3

我知道如果我只是在寻找每条记录的通话次数,我可以做一个简单的COUNT / GROUP BY。但是,我无法确定只计算到Connectedtrue的第一行的通话数。

到目前为止,我有:

select RecordID, Timestamp, Connected,
row_number() over ( partition by RecordID order by Timestamp asc)
from historyTable

给我每次呼叫尝试:呼叫详细信息(ID,时间戳等)以及尝试的号码。我是在正确的轨道上,还是有更好的方法来做到这一点?

1 个答案:

答案 0 :(得分:1)

我会使用一个子查询来计算调用成功之前的行数:

SELECT h1.RecordID, 
       h1.Timestamp, 
       h1.Connected,
       CallsUntilSuccessful = CASE WHEN NOT EXISTS
                              (
                                SELECT 1 FROM HistoryTable h2
                                WHERE h1.RecordID = h2.RecordID
                                  AND h2.Connected = 1
                              ) THEN NULL 
                              ELSE
                              ( 
                                SELECT COUNT(*) 
                                FROM HistoryTable h2
                                WHERE h1.RecordID = h2.RecordID
                                  AND h2.Connected = 0
                                  AND NOT EXISTS 
                                 (
                                    SELECT 1 FROM HistoryTable h3
                                    WHERE h3.RecordID = h2.RecordID
                                      AND h3.Timestamp < h2.Timestamp 
                                      AND h3.Connected = 1
                              )) + 1 END
FROM HistoryTable h1
ORDER BY RecordID,Timestamp

第一个NOT EXISTS处理没有成功通话的情况,第二个NOT EXISTS子查询确保没有成功通话在计算的非成功通话之前记录。最后+ 1将成功调用添加到非成功调用以获取正确的数字。

这是 演示 http://sqlfiddle.com/#!6/e7796/5/0