Я добавил скрипку, чтобы показать эту работу, но я скопирую запрос здесь для дальнейшего использования.
http://www.sqlfiddle.com/#!18/87593fe/12/0
Ниже очень близко к версии скрипта, простоиспользуя временную таблицу вместо постоянной.
Кроме того, я отредактировал пример данных, так как между именами в последних двух записях были лишние пробелы.Я предполагаю, что это было ошибкой.
DROP TABLE IF EXISTS #Table1
CREATE TABLE #Table1
([Name] varchar(9), [TimeATT] int, [DateTime] varchar(19))
;
INSERT INTO #Table1
([Name], [TimeATT], [DateTime])
VALUES
('jane doe', 1, '2019-04-23T08:00:00'),
('jane doe', 1, '2019-04-23T08:01:01'),
('jane doe', 2, '2019-04-23T12:00:00'),
('jane doe', 1, '2019-04-23T12:05:00'),
('john doe', 1, '2019-04-23T08:00:00'),
('john doe', 2, '2019-04-23T09:00:01'),
('john doe', 1, '2019-04-23T09:05:00'),
('john doe', 2, '2019-04-23T12:00:00')
SELECT [Name],[EntryTime], [ExitTime]
FROM ( -- sub query to get matching exit time for each entry if it exists
SELECT
[Name],
[DateTime] as EntryTime,
LEAD([DateTime], 1, NULL) OVER(PARTITION BY [Name] ORDER BY [DateTime]) AS ExitTime
,TimeATT, [DateTime]
FROM ( -- subquery to exclude duplicate records
SELECT * FROM ( -- subquery to identify records to ignore
SELECT
[Name], [TimeATT], [DateTime],
CASE LEAD(TimeATT, 1, 0) OVER(PARTITION BY [Name] ORDER BY [DateTime])
WHEN TimeATT THEN 1
ELSE 0
END AS Exclude
FROM #Table1) a
WHERE Exclude = 0
) t
) z
WHERE [TimeATT] = 1 -- filter so left column is always entry time.
ORDER BY [Name], [DateTime]
Примечание Для функции LEAD необходимо partitioned by
Имя, чтобы избежать исключения строк, в которых столбец TimeATT
совпадает в двух последовательных строках, нодля разных людей.
Я использовал LEAD вместо LAG, так как ваш образец возвратил 2-ую запись "Entry", когда были найдены дубликаты.
Это может быть написано более элегантно с CTE, но это работает.
Вот окончательный результат ..