2017-05-29 50 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,它似乎不喜歡你的示例中如何使用滯後函數。我會試着重新修改它,並驗證它是否符合我們的需求! –