TSQL Challenge 20 - Solution By Razvan Socol



--Razvan_Socol_TSQLChallange_20.sql
WITH Fibo AS (
	SELECT CONVERT(bigint,0) AS A, CONVERT(bigint,1) AS B, CONVERT(bigint,1) AS C
	UNION ALL
	SELECT B AS A, C AS B, B+C AS C
	FROM fibo
	WHERE B<4611686018427387904 -- 2^62
),
Digits AS (SELECT CONVERT(char(1),N) D FROM (VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) V(N)),
Repeats AS (
	SELECT C AS FiboNumber,
	--SUM(LEN(CONVERT(varchar(19),C))-LEN(REPLACE(CONVERT(varchar(19),C),D+D,'')))/2 AS NumRepeats
	SUM(CASE WHEN LEN(CONVERT(varchar(19),C))-LEN(REPLACE(CONVERT(varchar(19),C),D+D,''))>0 THEN 1 ELSE 0 END) AS NumRepeats
	FROM fibo CROSS JOIN Digits GROUP BY C
), 
Ranks AS (
	SELECT NumRepeats, FiboNumber, 
	RANK() OVER (PARTITION BY NumRepeats ORDER BY FiboNumber) Rnk
	FROM Repeats WHERE NumRepeats>0
)
SELECT NumRepeats, FiboNumber
FROM Ranks WHERE Rnk<=5

Did you find something incorrect/wrong with this solution? Take a few seconds to Report It.

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