サンプルデータにエラーが含まれており、2001または2004のモデルがないため、範囲は2000、2002-2003、および2005であると想定しました。私が正しければ、これは機能します。
WITH CTE AS
( SELECT Cars.CarMake,
Cars.CarModel,
[FirstYear] = Cars.CarYear,
[LastYear] = Cars.CarYear,
[Recursion] = 1
FROM Cars
UNION ALL
SELECT CTE.CarMake,
CTE.CarModel,
CTE.[FirstYear],
[LastYear] = Cars.CarYear,
[Recursion] = [Recursion] + 1
FROM CTE
INNER JOIN Cars
ON CTE.CarMake = Cars.CarMake
AND CTE.CarModel = Cars.CarModel
AND CTE.[LastYear] = Cars.CarYear - 1
), MaxCTE AS
( SELECT CarMake,
CarModel,
FirstYear,
LastYear,
Recursion,
[MaxRecursion] = MAX(Recursion) OVER(PARTITION BY CarMake, CarModel, FirstYear)
FROM CTE
)
SELECT MaxCTE.CarMake,
MaxCTE.CarModel,
[CarYearRange] = CAST(FirstYear AS VARCHAR(4)) + ' - ' + CAST(LastYear AS VARCHAR(4))
FROM MaxCTE
WHERE Recursion = MaxRecursion
AND NOT EXISTS
( SELECT 1
FROM MaxCTE ex
WHERE MaxCTE.CarMake = ex.CarMake
AND MaxCTE.CarModel = ex.CarModel
AND MaxCTE.FirstYear > ex.FirstYear
AND MaxCTE.LastYear = ex.LastYear
)
SQLフィドルの例
編集
要件を正しく解釈した場合は、リチャード・ザ・キウイの回答を使用してください。それは私のものよりもはるかに優れています!
改善されたソリューションのフィドル
SELECT CarMake,
CarModel,
[StartYear] = MIN(CarYear),
[EndYear] = MAX(CarYear)
FROM ( SELECT *,
[Offset] = CarYear - ROW_NUMBER() OVER (PARTITION BY CarMake, CarModel ORDER BY CarYear)
FROM Cars
) x
GROUP BY CarMake, CarModel, Offset
ORDER BY CarMake, CarModel, StartYear