Для этого вам нужен рекурсивный CTE или курсор.Рекурсивный подход CTE ниже.
;WITH BaseData(id,match1,match2,startdate,enddate)
AS (SELECT 1,'AAA','BBB','2006-01-01','2007-01-01' UNION ALL
SELECT 2,'AAA','BBB','2006-12-12','2008-01-01' UNION ALL
SELECT 3,'AAA','BBB','2008-01-01','2012-02-02' UNION ALL
SELECT 4,'AAA','BBB','2002-01-01','2004-01-01' UNION ALL
SELECT 5,'DDD','EEE','2009-01-01','2012-01-01' UNION ALL
SELECT 6,'DDD','EEE','2011-01-01','2020-01-01' UNION ALL
SELECT 7,'DDD','EEE','2013-01-01','2015-01-01' UNION ALL
SELECT 8,'DDD','EFG','2009-01-01','2012-01-01' ),
RecursiveCTE
AS (SELECT id,
match1,
match2,
startdate,
enddate,
CAST(NULL AS VARCHAR(4)) AS Status,
enddate AS LastSuccessfulEnd
FROM (SELECT *,
ROW_NUMBER() OVER (PARTITION BY match1, match2
ORDER BY startdate) RN
FROM BaseData) B
WHERE RN = 1
UNION ALL
SELECT id,
match1,
match2,
startdate,
enddate,
Status,
LastSuccessfulEnd
FROM (
SELECT B.*,
rn = ROW_NUMBER() OVER (PARTITION BY B.match1, B.match2
ORDER BY B.startdate),
CASE
WHEN B.startdate < R.LastSuccessfulEnd THEN 'FAIL'
END AS Status,
CASE
WHEN B.startdate >= R.LastSuccessfulEnd THEN B.enddate
ELSE R.enddate
END AS LastSuccessfulEnd
FROM BaseData B
JOIN RecursiveCTE R
ON R.match1 = B.match1
AND R.match2 = B.match2
AND B.startdate > R.startdate) R
WHERE R.rn = 1)
SELECT id,
match1,
match2,
startdate,
enddate,
Status
FROM RecursiveCTE
ORDER BY id