Как отмечают другие в комментариях, я не думаю, что дизайн / архитектура, на которую мы смотрим, великолепна. Если вы можете гарантировать, что строки ВСЕГДА будут последовательными, т. Е. Для каждого набора из двух строк, первая строка - это «Пациент с измененным режимом выписки в ближайшее время», а 2-я строка - это такой же пациент с режимом изменения Разряжается, тогда это должно работать.
;WITH OrderedTable AS
(
SELECT Unit
, IDNumber
, EnteredDateTime
, ROW_Number() OVER (Partition BY Unit ORDER BY Unit) RN
FROM @t -- YOUR TABLE NAME GOES HERE
)
SELECT t1.Unit
, t1.IDNumber
, t1.EnteredDateTime as TimeIn
, t2.EnteredDateTime as TimeOut
, DATEDIFF(hour, t1.EnteredDateTime, t2.EnteredDateTime ) TimeElapsedInHours
FROM OrderedTable t1
JOIN OrderedTable t2 ON t1.Unit = t2.Unit AND t2.RN = t1.RN + 1
WHERE t1.RN % 2 <> 0
Но я хочу пояснить - я не знаю, насколько безопасно это решение, основанное на ваших реальных данных. Однако он предоставит вам требуемые результаты на основе предоставленных вами образцов данных.
Даже если вы не можете использовать этот точный подход из-за вашей модели данных, я чувствую, что в нем есть несколько вещей, которые вы могли бы использовать для создания решения. Они сделают для интересного чтения, если ничего больше.
Вот тест, который я использовал ...
declare @t TABLE
(
LogId int,
SiteNumber int,
Unit varchar(50),
IDNumber int ,
LogCode varchar(50),
EnteredDateTime datetime,
ChangeMode varchar(50),
HowEntered varchar(50)
)
insert into @t values (851, 1, '16 - 0', 23502, 'BDISCHSET', '2011-11-12 11:48:08.890', 'Discharging Soon', 'SERIES')
insert into @t values (866, 1, '16 - 0 ', NULL, 'BDISCHRED', '2011-11-12 21:45:11.657', 'Discharged', 'SERIES')
insert into @t values (113, 2, '2001 - 0', 12384, 'BDISCHSET', '2011-10-28 09:27:08.773', 'Discharging Soon', 'SERIES')
insert into @t values (125, 2, '2001 - 0', NULL, 'BDISCHRED', '2011-10-28 10:38:08.060', 'Discharged', 'SERIES')
insert into @t values (119, 2, '2002 - 0', 12394, 'BDISCHSET', '2011-10-28 10:01:12.443', 'Discharging Soon', 'SERIES')
insert into @t values (139, 2, '2002 - 0', NULL, 'BDISCHRED', '2011-10-28 14:01:11.120', 'Discharged', 'SERIES')
insert into @t values (776, 2, '2002 - 0', 12331, 'BDISCHSET', '2011-11-10 09:08:09.443', 'Discharging Soon', 'SERIES')
insert into @t values (783, 2, '2002 - 0', NULL, 'BDISCHRED', '2011-11-10 11:08:08.537', 'Discharged', 'SERIES')
;WITH OrderedTable AS
(
SELECT Unit
, IDNumber
, EnteredDateTime
, ROW_Number() OVER (Partition BY Unit ORDER BY Unit) RN
FROM @t -- YOUR TABLE NAME GOES HERE
)
SELECT t1.Unit
, t1.IDNumber
, t1.EnteredDateTime as TimeIn
, t2.EnteredDateTime as TimeOut
, DATEDIFF(hour, t1.EnteredDateTime, t2.EnteredDateTime ) TimeElapsedInHours
FROM OrderedTable t1
JOIN OrderedTable t2 ON t1.Unit = t2.Unit AND t2.RN = t1.RN + 1
WHERE t1.RN % 2 <> 0