2017-05-29 33 views
2

我有一个名为Call的表和另一个名为CallLog的表。 CallLog链接到一个CallLogType具有特定条件的行的SQL Server日期差异

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上),并且使样本数据返回总时间为5分钟 (正在进行2分钟,忽略保持的5分钟然后再进行3分钟)。

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

+0

这是更容易解决您选择的编程语言。 – fancyPants

+0

你使用什么版本的SQL Server?请编辑问题并添加相应的标签。 –

回答

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 
1

我会使用LAG函数来获取下一个记录的日期,以便能够计算每个状态消耗的时间量。之后我会过滤OnHold状态。请注意,该查询将为用户提供参数中所述ID的所有呼叫:theFilterValue以及耗时。

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 
+0

我认为这可能是一个很好的解决方案。我忽略了提及我们正在使用SQL-Server,它似乎不喜欢你的示例中如何使用滞后函数。我会试着重新修改它,并验证它是否符合我们的需求! –