我有一个名为Call
的表,另一个名为CallLog
。 CallLog
链接到CallLogType
CallId AgentId
---------------------
1 123
2 765
3 134
4 134
5 134
CallLogId CallId Time LogType
---------------------------------------------------------------
1 1 2017-04-05 17:38:00 1 (InProgress)
2 1 2017-04-05 17:40:00 2 (OnHold)
3 1 2017-04-05 17:45:00 1 (InProgress)
4 1 2017-04-05 17:48:00 3 (Completed)
CallLogTypeId Description
--------------------------------
1 InProgress
2 OnHold
3 Completed
我需要编写一个查询,给定一个AgentId,查找当天的实际通话时间。 我遇到问题的一个部分是查询需要忽略上面例子中的'OnHold'状态。
我应该可以传入UserId 123(它们在Call#1上),并让它返回样本数据的总时间为5分钟 (正在进行2分钟,忽略暂停5分钟,然后再进行3分钟)。
我正在努力寻找解决这个问题的最佳方法。任何帮助将不胜感激!
答案 0 :(得分:1)
我会使用 LAG 函数来获取下一条记录的日期,以便能够计算每种状态所消耗的时间。之后我会过滤 OnHold 状态。请注意,查询将为参数:theFilterValue 中所述ID的用户提供所有调用,并消耗时间。
select c.CallId,
sum(datediff(minute, cl.time, lag(cl.time) over (order by cl.time))) as totalMinutes
from CallLog cl
inner join Call c on cl.CallId = c.CallId
where cl.LogTypeId <> 2 -- OnHold
and c.AgentId = :theFilterValue
and lag(cl.time) over (order by cl.time) is not null
group by
c.AgentId,
c.CallId
答案 1 :(得分:0)
暂时忘了这个,但又回来了,我觉得我应该发布某种答案!
我想出了一个(可能不太理想)的查询似乎可以解决这个问题并在原始问题中为模式返回正确的结果:
DECLARE @InProgress INT = 1
DECLARE @OnHold INT = 2
DECLARE @Completed INT = 3
DECLARE @AgentId INT = 123
DECLARE @Date DATE = '2017-07-11'
SELECT SUM(DATEDIFF(minute, LogJoin.Time, LogJoin.NextLogTime))
FROM Call C
INNER JOIN
(
SELECT
CL.CallId,
CL.LogType,
CL.Time,
LEAD(CL.LogType, 1, NULL) OVER (PARTITION BY CL.CallId ORDER BY CL.CallLogId ASC) AS NextLogType,
LEAD(CL.Time, 1, NULL) OVER (PARTITION BY CL.CallId ORDER BY CL.CallLogId ASC) AS NextLogTime
FROM CallLog CL
INNER JOIN Call C ON C.CallId = CL.CallId
WHERE C.AgentId = @AgentId AND @Date = CAST(CL.Time AS DATE)
) LogJoin ON LogJoin.CallId = C.CallId AND LogJoin.LogType <> @OnHold