我需要以下情况的帮助。计算用户唯一的开始结束时间集合
此表在SQL Server 2005上。如果您觉得2008年的某些功能会有帮助,我们也可以访问SQL Server 2008。尽管如此,我可以做到这一点。 :)
我有一个系统100多个用户的登录时间。他们可以同时登录到不同的频道。
我需要有端到端登录注销时候,不论通道
的我猜,这可以通过一个存储过程来完成。但如果它没有达到性能,我可以接受任何其他选择。
以下AgentResults2
是我的基础表。
AgentOutcome
表是我想要的样子。
基表
FUser_id FLoginDt FLogoutDt
30001 2012-02-17 12:32:15.473 2012-02-17 14:15:36.547
30001 2012-02-17 12:49:48.177 2012-02-17 14:10:01.097
30001 2012-02-17 14:30:49.293 2012-02-17 15:41:02.387
该用户登录到一个信道以12.32呆在那里直到14:15此期间,他也登录到另一个channelat 12点49分,在那里呆直到14内的一个例子: 10。并于14:30至15:41进行了新的登录。我想从这里得到两行是
FUser_id FLoginDt FLogoutDt
30001 2012-02-17 12:32:15.473 2012-02-17 14:15:36.547
30001 2012-02-17 14:30:49.293 2012-02-17 15:41:02.387
,当你在用户39395
SET DATEFORMAT DMY
IF OBJECT_ID('#AgentResults2', 'U') IS NOT NULL DROP TABLE #AgentResults2;
CREATE TABLE #AgentResults2 (FUser_id varchar(48), FLoginDt datetime, FLogoutDt DateTime)
Insert Into #AgentResults2 (FUser_id , FLoginDt, FLogoutDt)
Select '30001','17/02/2012 8:09:23.117 AM' ,'17/02/2012 8:39:28.527 AM' UNION ALL
Select '30001','17/02/2012 8:50:26.087 AM','17/02/2012 9:31:32.040 AM' UNION ALL
Select '30001','17/02/2012 10:28:42.430 AM','17/02/2012 10:54:13.880 AM' UNION ALL
Select '30001','17/02/2012 10:59:20.567 AM','17/02/2012 12:00:36.030 PM' UNION ALL
Select '30001','17/02/2012 12:32:15.473 PM','17/02/2012 2:15:36.547 PM' UNION ALL
Select '30001','17/02/2012 12:49:48.177 PM','17/02/2012 2:10:01.097 PM' UNION ALL
Select '30001','17/02/2012 2:30:49.293 PM','17/02/2012 3:41:02.387 PM' UNION ALL
Select '30001','17/02/2012 3:44:05.800 PM','17/02/2012 4:01:33.613 PM' UNION ALL
Select '39300','17/02/2012 8:06:31.250 AM','17/02/2012 3:51:31.930 PM' UNION ALL
Select '39300','17/02/2012 10:15:08.923 AM','17/02/2012 10:21:29.833 AM' UNION ALL
Select '39363','17/02/2012 9:58:44.287 AM','17/02/2012 11:20:08.950 AM' UNION ALL
Select '39363','17/02/2012 11:20:29.203 AM','17/02/2012 1:27:36.717 PM' UNION ALL
Select '39363','17/02/2012 1:27:36.717 PM','17/02/2012 3:05:12.383 PM' UNION ALL
Select '39363','17/02/2012 3:05:31.527 PM','17/02/2012 4:57:13.733 PM' UNION ALL
Select '39363','17/02/2012 4:57:44.640 PM','17/02/2012 5:59:20.273 PM' UNION ALL
Select '39395','17/02/2012 9:37:14.353 AM','17/02/2012 10:15:52.397 AM' UNION ALL
Select '39395','17/02/2012 10:15:28.427 AM','17/02/2012 10:58:47.080 AM' UNION ALL
Select '39395','17/02/2012 10:57:03.590 AM','17/02/2012 11:53:47.933 AM' UNION ALL
Select '39395','17/02/2012 11:51:31.567 AM','17/02/2012 2:26:27.640 PM' UNION ALL
Select '39395','17/02/2012 2:31:30.247 PM','17/02/2012 4:04:44.217 PM' UNION ALL
Select '39395','17/02/2012 4:10:49.013 PM','17/02/2012 4:11:26.983 PM' UNION ALL
Select '39395','17/02/2012 4:17:16.813 PM','17/02/2012 5:55:47.187 PM' UNION ALL
Select '39395','17/02/2012 4:55:25.900 PM','17/02/2012 5:26:07.310 PM' ;
Select * from #AgentResults2;
IF OBJECT_ID('#AgentOutcome', 'U') IS NOT NULL DROP TABLE #AgentOutcome;
CREATE TABLE #AgentOutcome (FUser_id varchar(48), FLoginDt datetime, FLogoutDt DateTime)
Insert Into #AgentOutcome (FUser_id , FLoginDt, FLogoutDt)
Select '30001','17/02/2012 8:09:23.117 AM','17/02/2012 8:39:28.527 AM' UNION ALL
Select '30001','17/02/2012 8:50:26.087 AM','17/02/2012 9:31:32.040 AM' UNION ALL
Select '30001','17/02/2012 10:28:42.430 AM','17/02/2012 10:54:13.880 AM' UNION ALL
Select '30001','17/02/2012 10:59:20.567 AM','17/02/2012 12:00:36.030 PM' UNION ALL
Select '30001','17/02/2012 12:32:15.473 PM','17/02/2012 2:15:36.547 PM' UNION ALL
Select '30001','17/02/2012 2:30:49.293 PM','17/02/2012 3:41:02.387 PM' UNION ALL
Select '30001','17/02/2012 3:44:05.800 PM','17/02/2012 4:01:33.613 PM' UNION ALL
Select '39300','17/02/2012 8:06:31.250 AM','17/02/2012 3:51:31.930 PM' UNION ALL
Select '39363','17/02/2012 9:58:44.287 AM','17/02/2012 11:20:08.950 AM' UNION ALL
Select '39363','17/02/2012 11:20:29.203 AM','17/02/2012 3:05:12.383 PM' UNION ALL
Select '39363','17/02/2012 3:05:31.527 PM','17/02/2012 4:57:13.733 PM' UNION ALL
Select '39363','17/02/2012 4:57:44.640 PM','17/02/2012 5:59:20.273 PM' UNION ALL
Select '39395','17/02/2012 9:37:14.353 AM','17/02/2012 2:26:27.640 PM' UNION ALL
Select '39395','17/02/2012 2:31:30.247 PM','17/02/2012 4:04:44.217 PM' UNION ALL
Select '39395','17/02/2012 4:10:49.013 PM','17/02/2012 4:11:26.983 PM' UNION ALL
Select '39395','17/02/2012 4:17:16.813 PM','17/02/2012 5:55:47.187 PM' ;
Select * from #AgentOutcome;
DROP TABLE #AgentResults2;
DROP TABLE #AgentOutcome;
我已经检查了其他相关的主题,他们接近,但更具体的聚合就变得复杂并满足min开始& mx结束时间。
我正在使用的代码是
;with Ranges as (
select FUser_id,FloginDt,FlogoutDt
from #AgentResults2
union all
select r.FUser_id,r.FloginDt,t.FLogoutdt
from
Ranges r
inner join
#AgentResults2 t
on
r.FUser_id = t.FUser_Id and DATEDIFF(ms,r.Flogoutdt,t.FloginDt) = 0
),
ExtendedRanges as (
select FUser_id,MIN(FloginDt) as FloginDt,Flogoutdt
from Ranges
group by FUser_ID,Flogoutdt
)
select FUser_Id,FloginDt,MAX(Flogoutdt)
from ExtendedRanges
group by FUser_id,FloginDt
order by 1
OPTION (MAXRECURSION 0)
也许搜索SQL重叠范围,例如[这个问题](http://stackoverflow.com/questions/4345910/merge-rows-based-on-date-in-sql-server) – 2012-02-21 08:14:34
谢谢@Damien_The_Unbeliever指向我的另一个问题。看完这个问题后,我很高兴 - 认为就是这样。但是在做出相应的代码之后,我没有看到预期的结果。另一个问题有一个诀窍,就是将第二天结合在同一行中,但是,如果同一毫秒包含在同一行中,则我的结果是两倍1)。 2)如果不到endtime还包括做一行。这并不完全符合我的情况。我附上了我在下一条评论中使用的代码。 – CeeVei 2012-02-21 13:05:16
如果您发布复杂的代码,最好编辑您的问题,以便您可以正确格式化它。 – 2012-02-21 13:12:55