IF OBJECT_ID('tempdb..#MyTable') IS NOT NULL DROP TABLE #MyTable CREATE TABLE #MyTable ( Person CHAR(1) ,[Name] VARCHAR(3) ,Country VARCHAR(10) ,add_info VARCHAR(10) ,[Begin] INT ,[End] INT ) INSERT INTO #MyTable (Person, Name, Country, add_info, [Begin], [End]) VALUES ('A', 'mnb', 'USA', 'prim', 4, 12), ('A', 'mnb', 'USA', 'x', 13, 15), ('A', 'mnb', 'USA', 'un', 16, 25), ('A', 'mnb', 'USA', 'fdfds', 1, 2), ('B', 'ghf', 'CAN', 'sdg', 3, 27), ('B', 'ghf', 'CAN', 'hgh', 28, 29), ('B', 'ghf', 'CAN', 'y', 24, 31), ('B', 'ghf', 'CAN', 'ghf', 38, 42); WITH CTE AS (SELECT mt.Person ,mt.Name ,mt.Country ,mt.add_info ,mt.[Begin] ,mt.[End] --,LEAD([Begin], 1) OVER (PARTITION BY mt.Person ORDER BY [End]) --,CASE WHEN [End] + 1 = LEAD([Begin], 1) OVER (PARTITION BY mt.Person ORDER BY [End]) -- --AND LEAD([Begin], 1) OVER (PARTITION BY mt.Person ORDER BY [End]) = LEAD([End], 1) OVER (PARTITION BY mt.Person ORDER BY [End]) -- THEN 1 -- ELSE 0 -- END AS Grp --,MARKER = COALESCE(LEAD([Begin], 1) OVER (PARTITION BY mt.Person ORDER BY [End]), LAG([End], 1) OVER (PARTITION BY mt.Person ORDER BY [End])) ,CASE WHEN mt.[End] + 1 = COALESCE(LEAD([Begin], 1) OVER (PARTITION BY mt.Person ORDER BY [End]), LAG([End], 1) OVER (PARTITION BY mt.Person ORDER BY [End])) OR 1 + COALESCE(LEAD([Begin], 1) OVER (PARTITION BY mt.Person ORDER BY [End]), LAG([End], 1) OVER (PARTITION BY mt.Person ORDER BY [End])) = mt.[Begin] OR COALESCE(LEAD([Begin], 1) OVER (PARTITION BY mt.Person ORDER BY [Begin]), LAG([End], 1) OVER (PARTITION BY mt.Person ORDER BY [Begin])) BETWEEN mt.[Begin] AND mt.[End] OR [End] BETWEEN LAG([Begin], 1) OVER (PARTITION BY mt.Person ORDER BY [Begin]) AND LAG([End], 1) OVER (PARTITION BY mt.Person ORDER BY [Begin]) THEN 1 ELSE 0 END AS GapMarker ,InBetween = COALESCE(LEAD([Begin], 1) OVER (PARTITION BY mt.Person ORDER BY [Begin]), LAG([End], 1) OVER (PARTITION BY mt.Person ORDER BY [Begin])) ,EndInBtw = LAG([Begin], 1) OVER (PARTITION BY mt.Person ORDER BY [Begin]) ,LagEndInBtw = LAG([End], 1) OVER (PARTITION BY mt.Person ORDER BY [Begin]) FROM #MyTable mt --ORDER BY mt.Person, mt.[Begin] ) SELECT DISTINCT X.Person ,X.[Name] ,X.Country ,t.add_info ,X.MinBegin ,X.MaxEnd FROM (SELECT c.Person ,c.[Name] ,c.Country ,c.add_info ,c.[Begin] ,c.[End] ,c.GapMarker ,c.InBetween ,c.EndInBtw ,c.LagEndInBtw ,MIN(c.[Begin]) OVER (PARTITION BY c.Person, c.GapMarker ORDER BY c.Person) AS MinBegin ,MAX(c.[End]) OVER (PARTITION BY c.Person, c.GapMarker ORDER BY c.Person) AS MaxEnd --, CASE WHEN c.[End]+1 = c.MARKER -- OR c.MARKER +1 = c.[Begin] -- THEN 1 -- ELSE 0 -- END Grp FROM CTE AS c) X LEFT JOIN #MyTable AS t ON t.[Begin] = X.[MinBegin] AND t.[End] = X.[MaxEnd] AND t.Person = X.Person ORDER BY X.Person, X.MinBegin --ORDER BY Person, [Begin]