我假定(也許brashly),你的樣本數據中包含一個錯誤,該範圍應該是2000年,2002- 2003年,和2005年因爲有2001年或沒有模型2004年如果我是正確的,那麼這將工作:
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 Fiddle Example
編輯
如果我已經正確地解釋了要求,使用RICHARD的KIWI的答案。它比礦井好得多!
Fiddle for the improved solution
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
您如何確定年份範圍? – RichardTheKiwi