TSQL Challenge 20 - Solution By Eric Freeman



--Eric_Freeman_tsqlchallenge_20_v1.sql
;WITH FiboNumbers(PreviousNumber, FiboNumber, NumRepeats) AS (
	SELECT CAST(0 AS BIGINT), CAST(1 AS BIGINT), CAST(0 AS INT)
	UNION ALL
    SELECT FiboNumber, PreviousNumber + FiboNumber
		, CASE CHARINDEX('00', CAST((PreviousNumber + FiboNumber) AS VARCHAR(19))) WHEN 0 THEN 0 ELSE 1 END
		+ CASE CHARINDEX('11', CAST((PreviousNumber + FiboNumber) AS VARCHAR(19))) WHEN 0 THEN 0 ELSE 1 END
		+ CASE CHARINDEX('22', CAST((PreviousNumber + FiboNumber) AS VARCHAR(19))) WHEN 0 THEN 0 ELSE 1 END
		+ CASE CHARINDEX('33', CAST((PreviousNumber + FiboNumber) AS VARCHAR(19))) WHEN 0 THEN 0 ELSE 1 END
		+ CASE CHARINDEX('44', CAST((PreviousNumber + FiboNumber) AS VARCHAR(19))) WHEN 0 THEN 0 ELSE 1 END
		+ CASE CHARINDEX('55', CAST((PreviousNumber + FiboNumber) AS VARCHAR(19))) WHEN 0 THEN 0 ELSE 1 END
		+ CASE CHARINDEX('66', CAST((PreviousNumber + FiboNumber) AS VARCHAR(19))) WHEN 0 THEN 0 ELSE 1 END
		+ CASE CHARINDEX('77', CAST((PreviousNumber + FiboNumber) AS VARCHAR(19))) WHEN 0 THEN 0 ELSE 1 END
		+ CASE CHARINDEX('88', CAST((PreviousNumber + FiboNumber) AS VARCHAR(19))) WHEN 0 THEN 0 ELSE 1 END
		+ CASE CHARINDEX('99', CAST((PreviousNumber + FiboNumber) AS VARCHAR(19))) WHEN 0 THEN 0 ELSE 1 END
    FROM FiboNumbers
    WHERE PreviousNumber <= 4611686018427387904) --half of bigint max value
, FiboNumbersByNumRepeats AS (
	SELECT ROW_NUMBER() OVER (PARTITION BY NumRepeats ORDER BY FiboNumber) AS TopX
		, FiboNumber
		, NumRepeats
	FROM FiboNumbers
	where NumRepeats > 0)
--PRESENTATION
SELECT NumRepeats, FiboNumber
FROM FiboNumbersByNumRepeats
WHERE TopX <= 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.