Вот пример:
SELECT *
INTO #years
FROM (VALUES
(1990),
(1991),
(1992),
(1999),
(2001),
(2002),
(2015)) AS D(Year)
SELECT STUFF((
SELECT ',' +
CASE
WHEN MIN(Year) = MAX(Year) THEN CAST(MIN(Year) AS VARCHAR(9))
WHEN MIN(Year) <> MAX(Year) THEN CAST(MIN(Year) AS VARCHAR(4)) + '-' +CAST(MAX(Year) AS VARCHAR(4))
END AS [text()]
FROM (
SELECT Year
,Year-ROW_NUMBER() OVER (ORDER BY Year) AS rowID
FROM #years) a
GROUP BY rowID
FOR XML PATH('')
),1,1,'');
Основная идея состоит в том, чтобы найти так называемые островки, которые в данном случае легко сделаны с помощью ROW_NUMBER
в этом выбрать:
SELECT Year ,Year-ROW_NUMBER() OVER (ORDER BY Year)
лет будут вычтены из номеров строк, которые будут отмечать одни и те же «острова». Значение, если каждый последующий год увеличивается на единицу, как номер строки делает, мы получим тот же номер результата:
YEAR RowNR RESULT
1999 1 1998
2000 2 1998
2015 3 2012
Этот результат цифры могут быть впоследствии использованы для группировки и получения значений MAX и MIN.
Да, это возможно. – Tom
Спасибо ... обновил мой вопрос. – user3071284
Почему downvote? Если что-то я должен избегать, это поможет узнать, что это такое. – user3071284