SQL 具有特定条件的行的服务器日期差异
SQL Server date diff for rows with certain conditions
我有一个 table 名为 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(他们正在呼叫 #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
我有一个 table 名为 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(他们正在呼叫 #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