2012-03-26 72 views
1

在下表中,我需要找出登录日期以及用户会话跨越多长时间。例如,empid = 1在2009年1月1日@ 3:20登录(typeid = 1),并在同一天3:25注销(typeid = 2)。输出应该是:按一列和两行分组

logged on,  session length, sessionid 
1/1/2009 3:20 5:00    014A3B2C-3874-4D84-A5B3-F234AA2AE30D 

每个sessionid都是唯一的。我如何创建这样的查询?

create table a (empid int, typeid int, created datetime, sessionid nvarchar(36)) 

insert into a(empid, typeid, created, sessionid) 
values(1, 1, '01/01/2009 3:20:00', '014A3B2C-3874-4D84-A5B3-F234AA2AE30D') 
insert into a(empid, typeid, created, sessionid) 
values(1, 2, '01/01/2009 3:25:00', '014A3B2C-3874-4D84-A5B3-F234AA2AE30D') 
insert into a(empid, typeid, created, sessionid) 
values(2, 1, '01/09/2009 4:20:00', '014A3B2C-3874-4D84-A5B3-F234AA2AE30E') 
insert into a(empid, typeid, created, sessionid) 
values(3, 1, '01/10/2009 3:25:00', '014A3B2C-3874-4D84-A5B3-F234AA2AE30F') 
insert into a(empid, typeid, created, sessionid) 
values(2, 2, '01/09/2009 4:23:00', '014A3B2C-3874-4D84-A5B3-F234AA2AE30E') 
insert into a(empid, typeid, created, sessionid) 
values(3, 2, '01/10/2009 4:25:00', '014A3B2C-3874-4D84-A5B3-F234AA2AE30F') 
select * from a 

drop table a 

- 编辑 - 有些场景我想过滤掉。作为一个例子,对于EMPID = 1时,它可能是这个代替:

insert into a(empid, typeid, created, sessionid) 
values(1, 1, '01/01/2009 3:20:00', '014A3B2C-3874-4D84-A5B3-F234AA2AE30D') 
insert into a(empid, typeid, created, sessionid) 
values(1, 1, '01/01/2009 3:25:00', '014A3B2C-3874-4D84-A5B3-F234AA2AE30D') 

上面EMPID不具有匹配的typeid = 2。有两个typeid = 1。

+1

您必须在会话ID上进行自我加入。 – 2012-03-26 18:54:41

+0

@DavidFaber - 根本不需要,一个简单的'GROUP BY SessionId'就够了 – Lamak 2012-03-26 18:58:34

回答

1
select empid,sessionid, 
    min(created),max(created), 
    datediff(mi,min(created),max(created)) 
from a 
group by empid,sessionid 
+0

谢谢。我添加了一个可能会看到如何过滤的场景编辑。 – 4thSpace 2012-03-26 19:47:45

1
SELECT LogOn.[created] as [logged on], DATEDIFF(day,LogOn.[created],LogOff.[created]) + ' ' + DATEDIFF(hour,LogOn.[created],LogOff.[created]) + ':' + DATEDIFF(minutes,LogOn.[created],LogOff.[created]) + ':' + DATEDIFF(second,LogOn.[created],LogOff.[created]), a.[sessionid] 
FROM a as [LogOn] 
JOIN a as [LogOff] ON LogOn.[sessionid] = LogOff.[sessionid] 
WHERE LogOn.[typeid] = 1 AND LogOff.[typeid] = 2 
+0

我建议在sessionid,typeid上创建唯一的索引/约束。 – 2012-03-26 19:01:37

1
SELECT SessionId, 
     MIN(CASE WHEN typeid = 1 THEN created END) [logged on], 
     DATEDIFF(SECOND,MIN(CASE WHEN typeid = 1 THEN created END),MIN(CASE WHEN typeid = 2 THEN created END)) [session length] 
FROM a 
GROUP BY sessionId 

你需要操纵会话长度以获得所需的输出格式,虽然。