Это идеальное использование для функций LEAD
и LAG
, которые были добавлены в SQL Server 2012. Это гораздо более эффективно, чем самостоятельное объединение.
Я использую CTE ниже, чтобы сделать запрос очень понятным и легким для чтения.
WITH
CTE
AS
(
SELECT
ProdID
,SalesmanCurrentName
,SalesmanCurrentDT
,SalesmanBeforeName
,SalesmanBeforeDT
,SalesmanAfterName
,SalesmanAfterDT
,LEAD(SalesmanCurrentName) OVER (PARTITION BY ProdID ORDER BY SalesmanCurrentDT) AS NewSalesmanAfterName
,LEAD(SalesmanCurrentDT) OVER (PARTITION BY ProdID ORDER BY SalesmanCurrentDT) AS NewSalesmanAfterDT
,LAG(SalesmanCurrentName) OVER (PARTITION BY ProdID ORDER BY SalesmanCurrentDT) AS NewSalesmanBeforeName
,LAG(SalesmanCurrentDT) OVER (PARTITION BY ProdID ORDER BY SalesmanCurrentDT) AS NewSalesmanBeforeDT
FROM SalesTable
)
UPDATE CTE
SET
SalesmanBeforeName = NewSalesmanBeforeName
,SalesmanBeforeDT = NewSalesmanBeforeDT
,SalesmanAfterName = NewSalesmanAfterName
,SalesmanAfterDT = NewSalesmanAfterDT
;
-- SELECT * FROM CTE
Вы можете сначала прокомментировать часть UPDATE
и запустить SELECT * FROM CTE
, чтобы подтвердить правильность результатов, а затем выполнить UPDATE
.