DECLARE @t TABLE (Data VARCHAR(40) ) INSERT @t (Data) SELECT '9992EDC6-D117-4DEE-B410-4E5FAE46AE97' INSERT @t (Data) SELECT '0BFC936B-BD9A-4C6A-AFB2-CF3F1752F8B1' INSERT @t (Data) SELECT '4A73E7EB-7777-4A04-9258-F1E75097977C' INSERT @t (Data) SELECT '5AAF477C-274D-400D-9067-035968F33B19' INSERT @t (Data) SELECT '725DA718-30D0-44A9-B36A-89F27CDFEEDE' INSERT @t (Data) SELECT '8083ED5A-D3B9-4694-BB04-F0B09C588888' ;WITH cte AS ( SELECT data , 1 AS pos , left(data, 1) AS chr , 1 AS length , 1 AS grp , 1 AS start_pos FROM @t UNION ALL SELECT c.data , c.pos + 1 , SUBSTRING(c.data, c.pos+1, 1) , CASE WHEN SUBSTRING(t.data, c.pos+1, 1) = c.chr THEN c.length + 1 ELSE 1 END , CASE WHEN SUBSTRING(t.data, c.pos+1, 1) = c.chr THEN c.grp ELSE c.grp + 1 END , CASE WHEN SUBSTRING(t.data, c.pos+1, 1) = c.chr THEN c.start_pos ELSE c.pos+1 END FROM @t t JOIN cte c ON t.data = c.data WHERE c.pos < LEN(c.data) ) , result AS ( SELECT data , chr [Char] , start_pos AS Pos , MAX(length)[Len] FROM cte WHERE length > 1 GROUP BY data , chr , grp , start_pos ) SELECT Data , [Char] , Pos , [Len] FROM result ORDER BY MAX([len]) OVER(PARTITION BY data) DESC , data , pos
Did you understand how this solution work? If you find it difficult to understand, you can Request an Explanation or you can Write an explanation to help others better understand this.