使用SQL结果进行新查询
当我使用Genesys时,这个问题与电话信息有关,但我更喜欢在这里发布这个问题,因为这是一个与SQL相关的问题。我有两张桌子: 表1:CallerID包含CallerID和ConnID的一个表标识一个调用。 表2:Callinfo另一个表包括CallerID、以int格式存储的来电日期,以及一种转换方式和一个状态行,这与我将在下面解释的操作相对应。一个示例行是使用SQL结果进行新查询,sql,sql-server-2005,Sql,Sql Server 2005,当我使用Genesys时,这个问题与电话信息有关,但我更喜欢在这里发布这个问题,因为这是一个与SQL相关的问题。我有两张桌子: 表1:CallerID包含CallerID和ConnID的一个表标识一个调用。 表2:Callinfo另一个表包括CallerID、以int格式存储的来电日期,以及一种转换方式和一个状态行,这与我将在下面解释的操作相对应。一个示例行是 ConnID StartTime Status --------------------- -----
ConnID StartTime Status
--------------------- ----------- -----------
30119914212527698 1300286888 2
每次呼叫进入时,两个表都会更新。
我需要做的是获取过去两天内状态为2或4的所有来电,这些是Callinfo未接听的来电,并从CallerID表中获取CallerID。
之后,我需要检查同一个CallerID是否在Callinfo表中有新的寄存器,并通过其ConnID进行检查。如果这些新寄存器的状态与2O4不同,则表示通信成功,我应该删除CallerID of first查询
查询的目的是调用那些在过去两天内尝试调用但无法调用的客户端
第一个查询工作正常,您应该忽略DATEDIFF函数
DECLARE @twoDays BIGINT
SET @twoDays = 172800 --48hs expressed in seconds
SELECT DISTINCT ConnID, StartTime, CID.CallerID, Status FROM Callinfo
INNER JOIN dbo.CallerID CID
ON Callinfo.ConnID = CID.ConnID
WHERE
(Status = 2 OR Status = 4)
AND
StartTime > DATEDIFF(second, '1970-01-01 00:01:00', GETUTCDATE())- @twoDays
我不知道如何使用结果并检查是否有状态不同于2和4的新呼叫
我正在使用SQLServer2005
可以清除以下顺序:
如果呼叫方A的情况如下:
1/1 12pm: A call OK
1/1 1pm: A call FAIL
那么我应该得到结果。但如果情况是这样的:
1/1 12pm: A call OK
1/1 1pm: A call FAIL
2/1 12pm: A call OK
那么我就不应该因此而被解雇了。所以,当我在3/1上检查时,我不会得到结果,因为A的最后一次呼叫是正常的,而在4/1上,呼叫方A不应该出现在第一次查询中 我想我有一个工作基础
DECLARE @twoDays BIGINT
SET @twoDays = 172800 --48hs expressed in seconds
SELECT DISTINCT ConnID, StartTime, CID.CallerID, Status FROM Callinfo
INNER JOIN dbo.CallerID CID
ON Callinfo.ConnID = CID.ConnID
WHERE
(Status = 2 OR Status = 4)
AND
StartTime > DATEDIFF(second, '1970-01-01 00:01:00', GETUTCDATE())- @twoDays
AND CID.CallerID NOT IN (
SELECT DISTINCT CID.CallerID FROM Callinfo
INNER JOIN dbo.CallerID CID
ON Callinfo.ConnID = CID.ConnID
WHERE
(Status <> 2 AND Status <> 4)
AND
StartTime > DATEDIFF(second, '1970-01-01 00:01:00', GETUTCDATE())- @twoDays
)
当callerID出现在第二个查询中时,此查询将删除该callerID:也就是说,在过去2天内成功呼叫的呼叫者
缺陷:它无法检测A是否在第1天、召回第2天和故障范围为第1天到第3天之间呼叫。但是当你在第2天到第4天尝试时,他会在下一张支票上提出要求。像这样的事情应该会更快
DECLARE @twoDaysAgo DateTime
SET @twoDaysAgo = DATEADD(day,-2,GETDATE())
WITH MissedCalls AS
(
SELECT DISTINCT ConnID, StartTime, CID.CallerID, Status FROM Callinfo
JOIN dbo.CallerID CID ON Callinfo.ConnID = CID.ConnID
WHERE Status IN (2,4)
AND StartTime > @twoDaysAgo
), NotMissedCalls AS
(
SELECT DISTINCT ConnID, StartTime, CID.CallerID, Status
FROM Callinfo
JOIN dbo.CallerID CID ON Callinfo.ConnID = CID.ConnID
WHERE Status not in (2,4)
AND StartTime > @twoDaysAgo
-- following line may speed up or slow down depending on table sizes and indexes
AND CID.CallerID in (SELECT CALLERID FROM MissedCalls)
)
SELECT *
FROM MissedCalls
WHERE NOT CallerID IN (SELECT CallerID FROM NotMissedCalls)
注意:我没有测试,所以我可能有打字错误。为了安全起见,我将所有查询的所有列都放进去了,但我希望这可以得到改进。更少的列应该稍微快一点
这就解决了新问题
DECLARE @twoDaysAgo DateTime
SET @twoDaysAgo = DATEADD(day,-2,GETDATE())
WITH MissedCalls AS
(
SELECT ConnID, Max(StartTime) as LastFailDate, CID.CallerID FROM Callinfo
JOIN dbo.CallerID CID ON Callinfo.ConnID = CID.ConnID
WHERE Status IN (2,4)
AND StartTime > @twoDaysAgo
GROUP BY ConnID, CID.CallerID
), NotMissedCalls AS
(
SELECT ConnID,Max(StartTime) as LastGoodDate,CID.CallerID
FROM Callinfo
JOIN dbo.CallerID CID ON Callinfo.ConnID = CID.ConnID
WHERE Status not in (2,4)
AND StartTime > @twoDaysAgo
-- following line may speed up or slow down depending on table sizes and indexes
AND CID.CallerID in (SELECT CALLERID FROM MissedCalls)
GROUP BY ConnID, CID.CallerID
), CallList AS
(
SELECT LastFailDate, LastGoodDate, Bad.ConnID, Bad.CallerID
FROM MissedCalls Bad
JOIN NotMissedCalls Good ON Bad.ConnID = Good.ConnID AND Bad.CallerID = Good.CallerID
)
SELECT LastFailDate, ConnID, CallerID
FROM CallList
WHERE (LastGoodDate > LastFailDate) OR (LastGoodDate IS NULL)
是的,这是一个不同的问题,我感谢你的解决方案,我正试图从中解决我的问题。看起来不错,写了一些类似“上次失败/上次好”的东西。你更快了:我会根据我的环境调整它,看看是否有效。谢谢你们@M'vy:嘿,谢谢-本来会更快,但我在两个版本之间开了个会。