TSQL Challenge 14 - Solution by Ramdas Narayanan



-- ramdas_narayanan_tsqlchallenge_14.sql
SET NOCOUNT ON

DECLARE @t TABLE (Data VARCHAR(40) ) 
DECLARE @t1 TABLE (Data VARCHAR(40),charn CHAR(1),Posn INT, Occ INT) 
 
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' 

--Run the Create Function script prior to running this...
CREATE  FUNCTION udf_Get_Occurence(@Data AS VARCHAR(40))
RETURNS @t2 TABLE
(
	Data VARCHAR(40),charn CHAR(1),Posn INT, Occ INT 
)
AS
BEGIN

		DECLARE @Curr CHAR(1)
		DECLARE @Prev CHAR(1)
		DECLARE @occ INT
		DECLARE @pos INT
		DECLARE @Prevpos INT
		DECLARE @Len INT
		DECLARE @start INT
		DECLARE @t1 TABLE (Data VARCHAR(40),charn CHAR(1),Posn INT, Occ INT) 
		
		SELECT @Len = LEN(@Data)	
		SELECT @start = 1 
			
		WHILE @Len >= 0
		BEGIN
			SELECT @Pos=CHARINDEX(SUBSTRING(@Data,@start,1),@Data),@Curr=SUBSTRING(@Data,@start,1) 

			IF @pos > 0
			BEGIN
				IF @Prev = @Curr
				BEGIN
					SET @occ = @occ + 1
					SELECT @Prevpos = @pos
					SELECT @Prev = @Curr
					
				END
				ELSE
				BEGIN
					IF @Prevpos > 1
						SELECT @Prevpos = @start 
					IF @occ > 1
						INSERT INTO @t1 (Data,charn,Occ,Posn)
						select @Data,@Prev,@occ,@Prevpos
					SET @occ = 1
					SELECT @Prev = @Curr
				END
			END	
			SELECT @Len = @Len - 1
			SELECT @start = @start + 1
			
	    END
		
		

	
	INSERT INTO @t1 (Data,charn,Occ,Posn)
	select @Data,@Prev,@occ,@Start-1
	
	INSERT INTO @t2
	(Data,charn,Posn,Occ) 
	SELECT Data,charn,
		CASE WHEN Posn > 1 THEN Posn-Occ 
		ELSE Posn 
		END AS Posn,
	Occ As [Length] FROM @t1 WHERE Occ > 1
	
	RETURN
END

SELECT t.Data,t1.charn,t1.Posn,t1.Occ
FROM @t t CROSS APPLY dbo.udf_Get_Occurence(t.Data) AS t1