【发布时间】:2014-09-08 10:57:18
【问题描述】:
有没有办法判断一个呼叫是否与另一个正在进行的呼叫重叠。
例如,我有一个打入 10:00 并结束于 10:05 的电话。
第二次调用在10:02 结束并在10:06 结束,所以与第一次调用重叠,我如何在 sql 查询中显示这个?我有几千个电话要比较。
我有使用CallID, TimeAns, TimeFin的表
欢迎提出任何建议。
【问题讨论】:
标签: sql sql-server overlap
有没有办法判断一个呼叫是否与另一个正在进行的呼叫重叠。
例如,我有一个打入 10:00 并结束于 10:05 的电话。
第二次调用在10:02 结束并在10:06 结束,所以与第一次调用重叠,我如何在 sql 查询中显示这个?我有几千个电话要比较。
我有使用CallID, TimeAns, TimeFin的表
欢迎提出任何建议。
【问题讨论】:
标签: sql sql-server overlap
这里是非包含查询:
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
【讨论】:
在两个调用重叠的同一张表上加入:
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)
【讨论】:
当呼叫 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 > call2.start AND call1.start < 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)
)
;
【讨论】:
other.callid < calls.callid 以避免重复(a 与 b 重叠,b 与 a 重叠)。好吗?
查询应该可以帮助您:
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 ))
【讨论】: