Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用SQL结果进行新查询_Sql_Sql Server 2005 - Fatal编程技术网

使用SQL结果进行新查询

使用SQL结果进行新查询,sql,sql-server-2005,Sql,Sql Server 2005,当我使用Genesys时,这个问题与电话信息有关,但我更喜欢在这里发布这个问题,因为这是一个与SQL相关的问题。我有两张桌子: 表1:CallerID包含CallerID和ConnID的一个表标识一个调用。 表2:Callinfo另一个表包括CallerID、以int格式存储的来电日期,以及一种转换方式和一个状态行,这与我将在下面解释的操作相对应。一个示例行是 ConnID StartTime Status --------------------- -----

当我使用Genesys时,这个问题与电话信息有关,但我更喜欢在这里发布这个问题,因为这是一个与SQL相关的问题。我有两张桌子:

表1:CallerID包含CallerID和ConnID的一个表标识一个调用。 表2:Callinfo另一个表包括CallerID、以int格式存储的来电日期,以及一种转换方式和一个状态行,这与我将在下面解释的操作相对应。一个示例行是

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:嘿,谢谢-本来会更快,但我在两个版本之间开了个会。