Использование рекурсивного cte
with
-- sample data
mytable as(
select *
from (
values
(1, 1, 1)
,(2, 2, 1)
,(3, 3, 1)
,(4, 4, 1)
,(5, 5, 4)
,(6, 6, 5)
) t(ID, contract_number, ref_contract_number)
),
rcte as(
select ID, contract_number, ref_contract_number, 1 level
from mytable
where ref_contract_number = 5
union all
select p.ID, p.contract_number, p.ref_contract_number, level+1
from rcte
join mytable p on p.contract_number = rcte.ref_contract_number and p.contract_number != p.ref_contract_number
)
select *
from mytable
where contract_number = (select top(1) with ties ref_contract_number top_contract
from rcte
order by row_number() over(order by level desc))
Чтобы упростить использование запроса, оберните его во встроенный TVF dbFiddle