Поскольку столбец не вызывается, я думаю, нам придется использовать функцию ранжирования, а затем поэкспериментировать с запросом. Я не тестировал запрос, что-то похожее на приведенное ниже должно работать. Пожалуйста, сосредоточьтесь на функции ранжирования, которую я использую, и добавьте 1 ко второму запросу.
CREATE TABLE foo1
(
APPLYDATE datetime,
STARTDTM datetime,
ENDDTM datetime,
PERSONNUM int,
STARTREASON varchar(100),
ENDREASON varchar(100)
)
select getdate()
INSERT INTO foo1
VALUES ('2020-04-23 00:00:00.000','2020-04-23 06:30:47.223','2020-04-23 10:10:47.223',204901477,'newshift','out')
INSERT INTO foo1
VALUES ('2020-04-23 00:00:00.000','2020-04-23 21:45:47.223','2020-04-23 21:45:47.223',204901477,'newshift','missedout')
INSERT INTO foo1
VALUES ('2020-04-23 00:00:00.000','2020-04-23 10:10:47.223','2020-04-23 12:15:47.223',204901477,'newshift','out')
INSERT INTO foo1
VALUES ('2020-04-24 00:00:00.000','2020-04-24 06:30:47.223','2020-04-24 10:10:47.223',204901478,'newshift','out')
INSERT INTO foo1
VALUES ('2020-04-24 00:00:00.000','2020-04-24 21:45:47.223','2020-04-24 21:45:47.223',204901478,'newshift','missedout')
INSERT INTO foo1
VALUES ('2020-04-24 00:00:00.000','2020-04-24 10:10:47.223','2020-04-24 12:15:47.223',204901478,'newshift','out')
SELECT
aa.PERSONNUM,
ENDDTM = CASE
WHEN aa.ENDREASON = 'missedout' THEN bb.ENDDTM
ELSE aa.ENDDTM
END
FROM
(SELECT
ROW_NUMBER() OVER (PARTITION BY PERSONNUM ORDER BY PERSONNUM) AS id1,
*
FROM
foo1) aa
JOIN
(SELECT
ROW_NUMBER() OVER (PARTITION BY PERSONNUM ORDER BY PERSONNUM) + 1 AS id2,
*
FROM
foo1) bb ON aa.id1 = bb.id2