Группировка по одному столбцу и двум строкам - PullRequest
1 голос
/ 26 марта 2012

В следующей таблице мне нужно узнать дату входа в систему и продолжительность сеанса пользователя. Например, empid = 1 вошел в систему (typeid = 1) 01.01.2009 @ 3:20 и вышел из системы (typeid = 2) в тот же день в 3:25. Выход должен быть:

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

Каждый идентификатор сеанса уникален. Как мне создать такой запрос?

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.

Ответы [ 3 ]

1 голос
/ 26 марта 2012
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 
1 голос
/ 26 марта 2012
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

Вам нужно будет манипулировать продолжительностью сеанса, чтобы получить желаемый выходной формат.

1 голос
/ 26 марта 2012
select empid,sessionid,
    min(created),max(created),
    datediff(mi,min(created),max(created)) 
from a 
group by empid,sessionid
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...