TSQL Challenge 14 - Solution by Regan Wick (2)



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'



--use a numbers CTE to create a separate row for each char in the string
;WITH 
	 P0 AS (SELECT 1 AS C UNION ALL SELECT 1)
	,P1 AS (SELECT 1 AS C FROM P0 AS A, P0 AS B)
	,P2 AS (SELECT 1 AS C FROM P1 AS A, P1 AS B)
	,P3 AS (SELECT 1 AS C FROM P2 AS A, P2 AS B)
	,NumbersTable AS (SELECT ROW_NUMBER() OVER(ORDER BY C) AS n FROM P3) 

--Grouped Data CTE
,GroupedData AS
(
	SELECT
		 Data
		,SUBSTRING(Data,NumbersTable.n,1)			AS Chr
		,NumbersTable.n								AS Pos

		--dense rank minus the pos to create a grouping constant for ajacent equal values
		,(DENSE_RANK() OVER	
			(
				PARTITION BY 
					 Data
					,SUBSTRING(Data,NumbersTable.n,1)
				ORDER BY 
					 Data
					,SUBSTRING(Data,NumbersTable.n,1)
					,NumbersTable.n
			)-NumbersTable.n)						AS Grp			
	FROM
		 @t 
		,NumbersTable  
	WHERE
		NumbersTable.n <= LEN(Data)
)

--Summarized Data CTE
,SummarizedData AS
(
	SELECT
		 Data
		,Chr
		,MIN(Pos)		AS Pos
		,COUNT(Chr)		AS Len
	FROM
		GroupedData	
	GROUP BY
		 Data
		,Chr
		,Grp
	--this limits the output to record groups where ajacent values are equal
	HAVING
		COUNT(*) > 1
)

--output result
SELECT
	 SummarizedData.Data
	,SummarizedData.Chr
	,SummarizedData.Pos
	,SummarizedData.Len
FROM
	SummarizedData
	--apply largest group value by Data for ordering
	CROSS APPLY
		(
			SELECT
				 SummarizedDataApply.Data
				,MAX(SummarizedDataApply.Len) AS MAX_Len
			FROM
				SummarizedData SummarizedDataApply
			WHERE
				SummarizedData.Data = SummarizedDataApply.Data
			GROUP BY
				SummarizedDataApply.Data
		) AS MaxLenTable
ORDER BY
	 MaxLenTable.MAX_Len DESC
	,SummarizedData.Data
	,SummarizedData.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.