Эта версия оплачивает только поиск, если значение местоположения в текущей строке равно -1.В плане запроса левое объединение содержит предикат сквозного соединения, который пропускает выполнение внутренней стороны объединения, если местоположение <> -1.
;
WITH CTE
AS (
SELECT *
FROM (
VALUES
(1, 110 ,'2011/01/01 12:30', '2011/01/01 6:10', 456),
(2, 110 ,'2011/01/01 3:40', '2011/01/01 4:00', -1),
(3, 110 ,'2011/01/02 1:00', '2011/01/02 8:00', 89),
(4, 110 ,'2011/01/02 5:00', '2011/01/02 6:00', -1),
(5, 110 ,'2011/01/02 6:10', '2011/01/02 6:30', -1)
) V (record, fk, start_time, end_time, location)
)
SELECT T1.record,
T1.fk,
T1.start_time,
T1.end_time,
CASE WHEN T1.location != -1 THEN Location
ELSE
(
SELECT TOP (1)
T2.location
FROM CTE AS T2
WHERE T2.record < T1.record
AND T2.fk = T1.fk
AND T2.location != -1
ORDER BY T2.Record DESC
)
END
FROM CTE AS T1
;