SQL Project Planning

  • + 0 comments

    Working solution for MySQL:

    WITH CTE AS 
    (
    SELECT
    START_DATE
    ,END_DATE
    ,CASE 
    WHEN ROW_NUMBER() OVER(ORDER BY END_DATE DESC) = 1  THEN END_DATE  
    WHEN LEAD(END_DATE) OVER(ORDER BY END_DATE ASC)- END_DATE>1 THEN END_DATE ELSE NULL END AS PROJECT_END_DATE
    ,CASE WHEN ROW_NUMBER() OVER(ORDER BY END_DATE ASC) = 1 THEN START_DATE 
    WHEN START_DATE - LAG(START_DATE) OVER(ORDER BY END_DATE ASC)>1 THEN START_DATE
    ELSE NULL END AS PROJECT_START_DATE
    FROM PROJECTS
    )
    ,SUBQ AS 
    (
    SELECT
    START_DATE
    ,END_DATE
    ,PROJECT_START_DATE
    ,PROJECT_END_DATE
    FROM CTE
    )
    ,CALC AS
    (
    SELECT 
    STRT.PROJECT_START_DATE
    ,END.PROJECT_END_DATE
    ,1+END.PROJECT_END_DATE - STRT.PROJECT_START_DATE AS PROJECT_LENGTH
    FROM 
    (
    SELECT 
    x.PROJECT_START_DATE
    ,ROW_NUMBER() OVER(ORDER BY PROJECT_START_DATE ASC) AS RN__
    FROM (SELECT * FROM SUBQ WHERE  PROJECT_START_DATE IS NOT NULL) x
    )STRT
    INNER JOIN 
    (
    SELECT 
    y.PROJECT_END_DATE
    ,ROW_NUMBER() OVER(ORDER BY PROJECT_END_DATE ASC) AS RN__
    FROM (SELECT * FROM SUBQ WHERE  PROJECT_END_DATE IS NOT NULL) y
    )END
    ON STRT.RN__ = END.RN__
    )
    SELECT
    PROJECT_START_DATE, PROJECT_END_DATE
    FROM CALC
    ORDER BY PROJECT_LENGTH ASC, PROJECT_START_DATE ASC;