【问题标题】:Overlapping call durations重叠通话时长
【发布时间】:2014-09-08 10:57:18
【问题描述】:

有没有办法判断一个呼叫是否与另一个正在进行的呼叫重叠。

例如,我有一个打入 10:00 并结束于 10:05 的电话。

第二次调用在10:02 结束并在10:06 结束,所以与第一次调用重叠,我如何在 sql 查询中显示这个?我有几千个电话要比较。

我有使用CallID, TimeAns, TimeFin的表

欢迎提出任何建议。

【问题讨论】:

标签: sql sql-server overlap


【解决方案1】:

这里是非包含查询:

SELECT * FROM myCalls t1
INNER JOIN myCalls t2 on t2.CallID != t1.CallID 
    AND t1.TimeAns < t2.TimeFin
    AND t1.TimeFin >  t2.TimeAns 

此查询将为每个重叠返回 2 行。如果您希望每次重叠只有一行,则可以这样做:

SELECT * FROM myCalls t1
INNER JOIN myCalls t2 on t2.CallID > t1.CallID 
    AND t1.TimeAns < t2.TimeFin
    AND t1.TimeFin >  t2.TimeAns 

【讨论】:

  • 感谢所有回复,我接受了这个答案,因为这是我测试过的,现在正在工作,对我来说是最合乎逻辑的,尽管我知道其他一些查询类似,所以可能这样做同一份工作
【解决方案2】:

在两个调用重叠的同一张表上加入:

SELECT * FROM TABLE
JOIN TABLE t2 on t2.CallID != TABLE.CallID and 
    (CallID.TimeFin BETWEEN t2.TimeAns AND t2.TimeFin
    OR CallID.TimeAns BETWEEN t2.TimeAns AND t2.TimeFin)

【讨论】:

    【解决方案3】:

    当呼叫 1 的开始或结束位于呼叫 2 的开始和结束之间时,两个呼叫重叠。(不管这两个呼叫中的哪一个称为“呼叫 1”,哪个称为“呼叫 2”。)

    WHERE 
    (
      call1.start BETWEEN call2.start AND call2.end
      OR
      call1.end BETWEEN call2.start AND call2.end
    )
    

    编辑:如果您考虑两个通话,其中一个在同一时间结束,而另一个开始重叠或不重叠,请下定决心。 BETWEEN 子句可以。因此,如果您不想要这个,请将其替换为 (call1.start &gt; call2.start AND call1.start &lt; call2.end)

    编辑:查找所有重叠的调用组合:

    select * 
    from calls
    join calls other 
      on other.callid < calls.callid and 
      (
        (calls.timeans > other.timeans and calls.timeans < other.timefin)
        or
        (calls.timefin > other.timeans and calls.timeans < other.timefin)
      )
    ;
    

    【讨论】:

    • 我有几千个通话 ID 需要比较抱歉,我应该提到这不仅仅是 2 个通话
    • 所以描述你想要的结果。您是否有一个电话想知道它是否与其他电话重叠?或者您想选择表中所有重叠的调用组合? (顺便说一句,条件保持不变;您总是一次比较两个调用。)
    • 我想比较整个调用表,看看有多少调用重叠
    • 对不起,我不明白这个编辑,它看​​起来仍然只是比较 2 个调用,我知道我必须一次比较 2 个,但是我该如何做其余的调用。跨度>
    • 您从呼叫中获取一条记录,然后在重叠的呼叫中查找另一条记录(因此您循环遍历表并一次比较两个呼叫)。然后,您从调用中获取下一条记录并再次循环通过其他调用等。这就是查询的作用。我使用other.callid &lt; calls.callid 以避免重复(a 与 b 重叠,b 与 a 重叠)。好吗?
    【解决方案4】:

    查询应该可以帮助您:

    SELECT A.callID ,
    A.startTime OVERLAPPING_START_TIME, 
    A.endTime OVERLAPPING_END_TIME
        FROM phoneCall A 
             LEFT OUTER JOIN 
             phoneCall B 
       ON A.callID != B.callID
    WHERE
          ((B.startTime) BETWEEN (A.STARTTIME) AND (A.endTime ))
    OR 
          ((B.endTime ) BETWEEN (A.STARTTIME) AND (A.endTime ))
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-27
    相关资源
    最近更新 更多