TSQL Challenge 14 - Solution by Leonid Koyfman



-- leonid_koyfman_tsqlchallenge_14.sql

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 Numbers AS
( SELECT 
	NUMBER AS N
  FROM 
	MASTER..SPT_VALUES 
  WHERE 
	[TYPE]='P'
	AND NUMBER BETWEEN 1 AND 36
)
SELECT 
  Data
, [Char]
, Pos
, [Len]  
FROM 
  @t 
CROSS APPLY
  (
  SELECT 
	[CHAR]
  ,	MIN(N)	AS	POS
  ,	COUNT(*)AS	[LEN] 
  FROM
	(
	SELECT 
	  N
	, [CHAR]
	, N-ROW_NUMBER() OVER(PARTITION BY [CHAR] ORDER BY N) AS CharGrpN
	FROM 
		(
		SELECT 
			N
		,	SUBSTRING(Data, N ,1)	AS [CHAR]
		FROM
			Numbers	
		)AS D1
	)D2
  GROUP BY [CHAR],CharGrpN
  HAVING COUNT(*)>1
  )AS D3
ORDER BY 
  MAX([Len])OVER(PARTITION BY Data) desc
, COUNT(*)	OVER(PARTITION BY Data) desc
, Data
, Pos

--Data                                 Char Pos  Len 
-------------------------------------- ---- ---- ----
--8083ED5A-D3B9-4694-BB04-F0B09C588888 B    20   2 
--8083ED5A-D3B9-4694-BB04-F0B09C588888 8    32   5 
--4A73E7EB-7777-4A04-9258-F1E75097977C 7    10   4
--4A73E7EB-7777-4A04-9258-F1E75097977C 7    34   2
--9992EDC6-D117-4DEE-B410-4E5FAE46AE97 9    1    3
--9992EDC6-D117-4DEE-B410-4E5FAE46AE97 1    11   2
--9992EDC6-D117-4DEE-B410-4E5FAE46AE97 E    17   2
--5AAF477C-274D-400D-9067-035968F33B19 A    2    2
--5AAF477C-274D-400D-9067-035968F33B19 7    6    2
--5AAF477C-274D-400D-9067-035968F33B19 0    16   2
--5AAF477C-274D-400D-9067-035968F33B19 3    32   2
--725DA718-30D0-44A9-B36A-89F27CDFEEDE 4    15   2
--725DA718-30D0-44A9-B36A-89F27CDFEEDE E    33   2

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.