2012-03-26 9 views
1

次の表では、ログイン日とユーザーセッションの期間を調べる必要があります。たとえば、3:25に同じ日にempid = 1がログインした(typeid = 1)と1/1/2009 @ 3:20にログオフし(typeid = 2)ログオフしました。出力は次のようになります。1つの列と2つの行によるグループ化

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

各セッションIDは一意です。このようなクエリを作成するにはどうすればよいですか?

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 

- EDIT - 私はフィルタリングしたいのですが、いくつかのシナリオがあります。一例として、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が整合型ID = 2を有していません。 2つのtypeid = 1があります。

+1

セッションIDで自己結合を行う必要があります。 –

+0

@DavidFaber - まったく必要ではない、単純な 'GROUP BY SessionId'で十分でしょう。 – Lamak

答えて

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

ありがとうございます。シナリオの編集を追加しましたが、フィルタリングの仕方が分かるかもしれません。 – 4thSpace

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にユニークなインデックス/制約を作成することをお勧めします。 –

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 

あなたはしかし、所望の出力形式を得るために、セッションの長さを操作する必要があります。

関連する問題