Если вы не возражаете против использования CTE , следующий скрипт выдаст результаты, к которым вы стремитесь.
Testdata
DECLARE @Users TABLE (
PersonID INTEGER
, StartDate DATETIME
, StopDate DATETIME
)
INSERT INTO @Users
SELECT 1, '12-31-2007', '3-31-2008'
UNION ALL SELECT 1, '3-31-2008','6-30-2008'
UNION ALL SELECT 1, '6-30-2008','9-30-2008'
UNION ALL SELECT 2, '2-28-2008','3-31-2008'
UNION ALL SELECT 2, '3-31-2008','4-30-2008'
UNION ALL SELECT 2, '7-31-2008','8-31-2008'
UNION ALL SELECT 3, '5-31-2008','6-30-2008'
Оператор SQL
;WITH q AS (
SELECT PersonID, StartDate, StopDate
FROM @Users
UNION ALL
SELECT u.PersonId, q.StartDate, u.StopDate
FROM q
INNER JOIN @Users u ON u.PersonID = q.PersonID
AND u.StartDate = q.StopDate
)
SELECT PersonID, MIN(StartDate), StopDate
FROM (
SELECT PersonID, StartDate, [StopDate] = MAX(StopDate)
FROM q
GROUP BY
PersonID, StartDate
) p
GROUP BY
PersonID, StopDate
ORDER BY
PersonID, 2, 3