-- 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