SQL Project Planning

  • + 0 comments

    This is MySQL version how this can be done

    SELECT 
        T1.Start_Date,
        T2.End_Date
    FROM (
        SELECT ROW_NUMBER() OVER (ORDER BY Start_Date ASC) AS r,
        Start_Date
        FROM Projects
        WHERE (Start_Date NOT IN (SELECT End_Date FROM Projects))
    ) AS T1
    LEFT JOIN 
        (SELECT ROW_NUMBER() OVER (ORDER BY End_Date ASC) AS r,
        End_Date
        FROM Projects
        WHERE (End_Date NOT IN (SELECT Start_Date FROM Projects))
    ) AS T2 ON T1.r=T2.r
    ORDER BY DATEDIFF(T2.End_Date, T1.Start_Date) ASC, T1.Start_Date ASC
    

    This is explanation

    -- Select the unmatched Start_Date and End_Date pairs
    SELECT 
        T1.Start_Date,     -- Start date of a project (not matched to any end date)
        T2.End_Date        -- End date of a project (not matched to any start date)
    FROM (
        -- Subquery T1: Get all Start_Dates that are not listed as End_Dates
        SELECT 
            ROW_NUMBER() OVER (ORDER BY Start_Date ASC) AS r,  -- Assign a row number for matching
            Start_Date
        FROM Projects
        WHERE Start_Date NOT IN (SELECT End_Date FROM Projects)  -- Filter: unmatched start dates
    ) AS T1
    
    -- LEFT JOIN to match each unmatched Start_Date with an unmatched End_Date
    LEFT JOIN (
        -- Subquery T2: Get all End_Dates that are not listed as Start_Dates
        SELECT 
            ROW_NUMBER() OVER (ORDER BY End_Date ASC) AS r,  -- Assign a row number for matching
            End_Date
        FROM Projects
        WHERE End_Date NOT IN (SELECT Start_Date FROM Projects)  -- Filter: unmatched end dates
    ) AS T2 
    ON T1.r = T2.r  -- Join rows by row number (to pair start and end dates in order)
    
    -- Order results by shortest duration first, then by Start_Date
    ORDER BY 
        DATEDIFF(T2.End_Date, T1.Start_Date) ASC,  -- Sort by number of days between Start and End
        T1.Start_Date ASC;