具有特定条件的行的SQL Server日期差异

时间:2017-05-29 10:38:33

标签: sql sql-server datediff

我有一个名为Call的表,另一个名为CallLogCallLog链接到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分钟)。

我正在努力寻找解决这个问题的最佳方法。任何帮助将不胜感激!

2 个答案:

答案 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