Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Найти разрывы в годах  [new]
Andrew_nik
Member

Откуда: Николаев
Сообщений: 286
Есть таблица с разрывами годов. Нужно найти разрывы в годах и вывести их в следующем виде:
1967-1979; 1998-2001; 2004-2014

MakeName ModelName YearID
Volkswagen Beetle 1967
Volkswagen Beetle 1968
Volkswagen Beetle 1969
Volkswagen Beetle 1970
Volkswagen Beetle 1971
Volkswagen Beetle 1972
Volkswagen Beetle 1973
Volkswagen Beetle 1974
Volkswagen Beetle 1975
Volkswagen Beetle 1976
Volkswagen Beetle 1977
Volkswagen Beetle 1978
Volkswagen Beetle 1979

Volkswagen Beetle 1998
Volkswagen Beetle 1999
Volkswagen Beetle 2000
Volkswagen Beetle 2001

Volkswagen Beetle 2004
Volkswagen Beetle 2005
Volkswagen Beetle 2006
Volkswagen Beetle 2007
Volkswagen Beetle 2008
Volkswagen Beetle 2009
Volkswagen Beetle 2010
Volkswagen Beetle 2012
Volkswagen Beetle 2013
Volkswagen Beetle 2014


Единственное что мне приходит в голову - это пройтись курсором по таблице, но отнюдь это будет не самый быстрый путь. Подскажите есть ли способ задействовать при этом DENSE_Rank или что-то вроде этого?
19 мар 13, 12:26    [14066542]     Ответить | Цитировать Сообщить модератору
 Re: Найти разрывы в годах  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
1) пронумеровать по порядку
2) найти разницу между номером года и номером, полученным на 1-м шаге
3) по этой разнице сгруппировать
4) внутри группы найти минимум и максимум
19 мар 13, 12:28    [14066551]     Ответить | Цитировать Сообщить модератору
 Re: Найти разрывы в годах  [new]
Glory
Member

Откуда:
Сообщений: 104751
Andrew_nik
Нужно найти разрывы в годах и вывести их в следующем виде:
1967-1979; 1998-2001; 2004-2014

И где в предложенных данных разрывы то ?
19 мар 13, 12:31    [14066573]     Ответить | Цитировать Сообщить модератору
 Re: Найти разрывы в годах  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
DECLARE @T TABLE(MakeName NVARCHAR(100),ModelName NVARCHAR(100),YearID INT);
INSERT @T(MakeName,ModelName,YearID)VALUES
 (N'Volkswagen',N'Beetle',1967)
,(N'Volkswagen',N'Beetle',1968)
,(N'Volkswagen',N'Beetle',1969)
,(N'Volkswagen',N'Beetle',1970)
,(N'Volkswagen',N'Beetle',1971)
,(N'Volkswagen',N'Beetle',1972)
,(N'Volkswagen',N'Beetle',1973)
,(N'Volkswagen',N'Beetle',1974)
,(N'Volkswagen',N'Beetle',1975)
,(N'Volkswagen',N'Beetle',1976)
,(N'Volkswagen',N'Beetle',1977)
,(N'Volkswagen',N'Beetle',1978)
,(N'Volkswagen',N'Beetle',1979)
,(N'Volkswagen',N'Beetle',1998)
,(N'Volkswagen',N'Beetle',1999)
,(N'Volkswagen',N'Beetle',2000)
,(N'Volkswagen',N'Beetle',2001)
,(N'Volkswagen',N'Beetle',2004)
,(N'Volkswagen',N'Beetle',2005)
,(N'Volkswagen',N'Beetle',2006)
,(N'Volkswagen',N'Beetle',2007)
,(N'Volkswagen',N'Beetle',2008)
,(N'Volkswagen',N'Beetle',2009)
,(N'Volkswagen',N'Beetle',2010)
,(N'Volkswagen',N'Beetle',2012)
,(N'Volkswagen',N'Beetle',2013)
,(N'Volkswagen',N'Beetle',2014);

WITH CTE AS(SELECT N=YearID-ROW_NUMBER()OVER(PARTITION BY MakeName,ModelName ORDER BY YearID),* FROM @T)
SELECT MakeName,ModelName,STUFF(
(
 SELECT N'; '+CAST(MIN(T.YearID) AS NVARCHAR)+N'-'+CAST(MAX(T.YearID) AS NVARCHAR) FROM CTE T
 WHERE T.MakeName=CTE.MakeName AND T.ModelName=CTE.ModelName
 GROUP BY T.MakeName,T.ModelName,T.N
 ORDER BY MIN(T.YearID)
 FOR XML PATH(''),TYPE).value('.','nvarchar(max)'),1,2,N''
)
FROM CTE
GROUP BY MakeName,ModelName
ORDER BY MakeName,ModelName;
19 мар 13, 12:48    [14066716]     Ответить | Цитировать Сообщить модератору
 Re: Найти разрывы в годах  [new]
Andrew_nik
Member

Откуда: Николаев
Сообщений: 286
Спасибо большое !
19 мар 13, 14:11    [14067399]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить