Я предполагаю, что здесь SrNo является последовательным.Я говорю это, потому что SrNo 5 был продублирован.Следующий запрос поможет:
CREATE TABLE #temp (SrNo INT, DTS DATETIME, RoleInstance VARCHAR(30), Id INT)
INSERT INTO #temp VALUES
(1,'2012-03-14 12:00:00.000','SLBMRole_IN_1',120007),
(2,'2012-03-14 12:01:00.000','SLBMRole_IN_1',120007),
(3,'2012-03-14 12:02:00.000','SLBMRole_IN_1',120007),
(4,'2012-03-14 12:24:00.000','SLBMRole_IN_0',120007),
(5,'2012-03-14 12:25:00.000','SLBMRole_IN_0',120007),
(6,'2012-03-14 12:26:00.000','SLBMRole_IN_0',120007),
(7,'2012-03-14 12:27:00.000','SLBMRole_IN_1',120007),
(8,'2012-03-14 12:28:00.000','SLBMRole_IN_1',120007)
WITH Logins AS (
SELECT t2.SrNo, ROW_NUMBER() OVER (ORDER BY t2.SrNo) AS join_no, t2.RoleInstance, t2.DTS, t2.Id
FROM #temp t2 LEFT JOIN #temp t1 ON t2.SrNo = t1.SrNo +1
WHERE t1.RoleInstance <> t2.RoleInstance OR t1.RoleInstance IS NULL),
Logouts AS (
SELECT t1.SrNo, ROW_NUMBER() OVER (ORDER BY t1.SrNo) AS join_no, t1.RoleInstance, t1.DTS, t1.Id
FROM #temp t1 LEFT JOIN #temp t2 ON t2.SrNo = t1.SrNo +1
WHERE t1.RoleInstance <> t2.RoleInstance OR t2.RoleInstance IS NULL)
SELECT i.Id, i.RoleInstance, i.SrNo AS InSrNo, i.DTS AS InDTS, o.SrNo AS OutSrNo, o.DTS AS OutDTS
FROM Logins i INNER JOIN Logouts o ON i.join_no = o.join_no
Два общих табличных выражения (Logins и Logouts) извлекают изменения в заданный RoleInstance и изменения из заданного RoleInstance, соответственно.Первая выполняет левое соединение от второй до первой из последующих записей, что позволяет первому из двух иметь нулевое значение для получения первого входа в систему.Вторая делает обратное, чтобы получить последний выход из системы.Затем они присоединяются к ключу, сгенерированному функцией ROW_NUMBER ().