SQL 具有特定条件的行的服务器日期差异

SQL Server date diff for rows with certain conditions

我有一个 table 名为 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(他们正在呼叫 #1),并让它 return 示例数据的总时间为 5 分钟 (正在进行 2 分钟,忽略暂停的 5 分钟,然后再进行 3 分钟)。

我正在努力寻找解决此问题的最佳方法。如有任何帮助,我们将不胜感激!

我会使用 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

暂时忘记了这个,但回过头来觉得我应该 post 某种形式的答案!

我提出了一个(可能不太理想的)查询,它似乎可以解决问题,returns 原始问题中架构的正确结果:

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