我无法正确提出请求,
结果应该会告诉我哪个数字在系统中停留多长时间。因此,当is_logedin_in_queue=1登录时当is_logedin_in_queue=0已注销时1到o之间的时间将显示总停留时间。
下面我展示了一个请求,我有一些东西不能正常工作——一些小东西。非常感谢。
num timeofupdate is_loggedin_in_queue
109 2021-04-27 06:00:02.000 1
265 2021-04-27 08:32:53.000 1
265 2021-04-27 11:42:34.000 0
265 2021-04-27 12:16:28.000 1
242 2021-04-27 13:23:34.000 0
242 2021-04-27 14:16:40.000 1
228 2021-04-27 14:30:25.000 0
228 2021-04-27 14:30:25.000 0
228 2021-04-27 15:46:40.000 1
228 2021-04-27 15:46:40.000 1
265 2021-04-27 16:41:53.000 0
242 2021-04-27 16:59:42.000 0
109 2021-04-27 17:00:00.000 0
SELECT *
FROM [tblAgentQueueStatus] qs2
WHERE qs2.[timeofupdate] = '2021-04-27'
) qs
LEFT JOIN [tblAgentQueueStatus] qs1 ON qs.q_num = qs1.q_num
AND qs.ag_num = qs1.ag_num
AND qs1.is_loggedin_in_queue = 0
AND qs.[timeofupdate] < qs1.[timeofupdate]
WHERE qs.is_loggedin_in_queue = 1
GROUP BY qs.q_num, qs.ag_num, qs.[timeofupdate]
) t
预期结果是时间差is_logedin_in_queue 1和is_logettin_in_queue 0在编号上
num 109 10:59:58-以相同的方式为其他人记录时间
您可以为此使用窗口函数。基本上,您希望将所有1
和以下0
分配给一个组,然后进行聚合。您可以使用累积反向和来分配分组。
select min(timeofupdate), max(timeofupdate),
datediff(second, min(timeofupdate), max(timeofupdate)) as diff_seconds
from (select aqs.*,
sum(case when is_loggedin_in_queue = 0 then 1 else 0 end) over (order by timeofupdate) as grp
from tblAgentQueueStatus aqs
) aqs
group by grp;
这对日期/时间函数使用SQL Server语法。SQL Server的选择主要基于代码中的方括号。
您可以使用滞后函数来解决这个问题。请注意,您的示例中有一些数据与您的描述不符。
这里是sqlfiddle向您展示的结果
这是代码:
select num,
datediff(minute, timeofupdate, prevTimeofupdate) as timeDifference,
(timeofupdate-prevTimeofupdate) as test
from
(
select *,
lag([timeofupdate]) over (partition by [num] order by [num], [timeofupdate]) as prevTimeofupdate
from Table1
) t
where is_loggedin_in_queue = 0