试试这个
DECLARE @SampleDAta AS TABLE
(
NewCustomerID int,
OldCustomerID int
)
INSERT INTO @SampleDAta VALUES (111, NULL),(222,111),(333,222),(444,333),(1111, NULL),(2222,1111),(3333,2222),(4444,3333),(5555,4444)
;with reTbl as (
select t.NewCustomerID, t.OldCustomerID, 1 as lev, t.NewCustomerID AS RootId
from @SampleDAta t
where t.OldCustomerID IS NULL
union all
select t.NewCustomerId, t.OldCustomerID, reTbl.lev +1, reTbl.RootId
from reTbl join
@SampleDAta t
on t.OldCustomerID = reTbl.NewCustomerID
),
LastestId AS
(
SELECT c.RootId, max(c.lev) AS MaxLevel
FROM reTbl c
GROUP BY c.RootId
)
select reTbl.NewCustomerID, reTbl1.NewCustomerID AS OldCustomerID
from reTbl
INNER JOIN reTbl reTbl1 ON reTbl.RootId = reTbl1.RootId
INNER JOIN LastestId t ON reTbl.RootId = t.RootId AND reTbl.lev = t.MaxLevel
WHERE reTbl.NewCustomerID != reTbl1.NewCustomerID
ORDER BY reTbl.NewCustomerID
什么是由''NewCustomerID'成为444'每'OldCustomerID'相关的逻辑是什么? –
@TimBiegeleisen我猜这些都是'444'在 – LONG
之前使用的所有历史ID客户正在从一个位置迁移到另一个位置,所以他的customerID不断变化。每当customerID发生变化时,都会记录它是什么以及现在是什么。 – Etienne