SQL Project Planning

  • + 0 comments

    Using Recursion

    WITH RECURSIVE CTE1 AS (
        SELECT *,
               ROW_NUMBER() OVER(ORDER BY Start_Date ASC) AS ind
        FROM PROJECTS
    ),
    
    CTE2 AS (
        -- Anchor member: the first row
        SELECT *,
               1 AS taggs,
               1 AS Levels
        FROM CTE1
        WHERE ind = 1
        
        UNION ALL
        
        -- Recursive member: subsequent rows
        SELECT 
            CTE1.Task_ID,
            CTE1.Start_Date,
            CTE1.End_Date,
            CTE1.ind,
            CASE 
                WHEN DATEDIFF(CTE1.Start_Date, CTE2.Start_Date) = 1 THEN CTE2.Levels
                ELSE CTE2.Levels + 1
            END AS taggs,
            CASE 
                WHEN DATEDIFF(CTE1.Start_Date, CTE2.Start_Date) = 1 THEN CTE2.Levels
                ELSE CTE2.Levels + 1
            END AS Levels
        FROM CTE1
        INNER JOIN CTE2 
        ON CTE1.ind = CTE2.ind + 1
    ),
    
    -- Select statement to get the desired columns
    
    CTE3 AS (
        SELECT Min(Start_Date) as Start_Dte,Max(End_Date) as End_Dte
    FROM CTE2
    Group by Levels
    Order by Start_Dte)
    
    ,
    CTE4 AS (
        SELECT *,
                      Row_Number() Over(Order By DATEDIFF(End_Dte,Start_Dte) ASC) AS ORDERR
    
    FROM CTE3
    

    )

    SELECT Start_Dte, End_Dte FROM CTE4