TSQL Challenge 14 - Solution by Aurelien Verla (1)



-- aurelien_verla_tsqlchallenge_14_1.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'

SELECT
	T2.[Data] AS 'Data',
	SUBSTRING(T2.[Data], T1.[number], 1) AS 'Char',
	T1.[number] AS 'Pos',
	CASE 
		WHEN PATINDEX(
			'%[^' + SUBSTRING(T2.[Data], T1.[number], 1) + ']%', 
			SUBSTRING(T2.[Data], T1.[number] + 1, LEN(T2.[Data]))
		) = 0 THEN LEN(T2.[Data]) - T1.[number] + 1 
		ELSE PATINDEX(
			'%[^' + SUBSTRING(T2.[Data], T1.[number], 1) + ']%', 
			SUBSTRING(T2.[Data], T1.[number] + 1, LEN(T2.[Data]))
		)
	END AS 'Len'
FROM [master].[dbo].[spt_values] AS T1, @t AS T2
WHERE T1.[type] = 'P' AND T1.[number] BETWEEN 1 AND LEN(T2.[Data])
AND SUBSTRING(T2.[Data], T1.[number], 1) <> SUBSTRING(T2.[Data], T1.[number] - 1, 1) 
AND SUBSTRING(T2.[Data], T1.[number], 1) = SUBSTRING(T2.[Data], T1.[number] + 1, 1)
ORDER BY
	MAX(
		CASE 
			WHEN PATINDEX(
				'%[^' + SUBSTRING(T2.[Data], T1.[number], 1) + ']%', 
				SUBSTRING(T2.[Data], T1.[number] + 1, LEN(T2.[Data]))
			) = 0 THEN LEN(T2.[Data]) + 1 - T1.[number]
			ELSE PATINDEX(
				'%[^' + SUBSTRING(T2.[Data], T1.[number], 1) + ']%', 
				SUBSTRING(T2.[Data], T1.[number] + 1, LEN(T2.[Data]))
			)
		END
	) OVER (PARTITION BY T2.[Data]) DESC,
	COUNT(T2.[Data]) OVER (PARTITION BY T2.[Data]) DESC,
	T2.[Data],
	T1.[number]

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.