我的MS SQL2008R2服务器上有一个包含历史电话呼叫数据的表,其中包含记录ID,时间戳以及呼叫是否已连接的布尔指示符。
我想确定每个记录的通话次数,包括第一个"连接记录"。例如,对于记录ID ABC123
..输出将是
RecordID CallsUntilSuccessful
ABC123 3
我知道如果我只是在寻找每条记录的通话次数,我可以做一个简单的COUNT
/ GROUP BY
。但是,我无法确定只计算到Connected
为true
的第一行的通话数。
到目前为止,我有:
select RecordID, Timestamp, Connected,
row_number() over ( partition by RecordID order by Timestamp asc)
from historyTable
给我每次呼叫尝试:呼叫详细信息(ID,时间戳等)以及尝试的号码。我是在正确的轨道上,还是有更好的方法来做到这一点?
答案 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
将成功调用添加到非成功调用以获取正确的数字。