TSQL Challenge 14 - Solution by Alexandre Dias



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.