HackerRank SQL Project Planning
START_DATE 중 어떤 END_DATE와 겹치는 값은, 어떤 프로젝트 기간에 포함되는 날이다.
이에 WITH 문을 활용하여 어떤 프로젝트의 시작일이 될 수 있는 값(START_TABLE), 마감일이 될 수 있는 값(END_DATE)을 먼저 구했다.
START_TABLE을 기준으로 설명하면, 아래와 같은 기준을 고려했다.
1. 어떤 프로젝트의 시작일이 될 수 있는 날은 END_DATE와 겹치지 않는 START_DATE이다.
2. 1을 만족하는 START_DATE에 대해, ROW_NUMBER()로 오름차순 기준으로 ROW_NUM를 매긴다.
3. START_TABLE, END_TABLE에서 ROW_NUM가 일치하는 값이 한 프로젝트의 시작일과 마감일이 된다.
WITH START_TABLE AS (
SELECT
START_DATE,
ROW_NUMBER() OVER (ORDER BY START_DATE) AS ROW_NUM
FROM
PROJECTS
WHERE
START_DATE NOT IN (SELECT END_DATE FROM PROJECTS)
), END_TABLE AS (
SELECT
END_DATE,
ROW_NUMBER() OVER (ORDER BY END_DATE) AS ROW_NUM
FROM
PROJECTS
WHERE
END_DATE NOT IN (SELECT START_DATE FROM PROJECTS)
)
SELECT
S.START_DATE AS PROJECT_START,
E.END_DATE AS PROJECT_END
FROM
START_TABLE AS S
JOIN
END_TABLE AS E
ON
S.ROW_NUM = E.ROW_NUM
ORDER BY
DATEDIFF(END_DATE, START_DATE) ASC,
START_DATE ASC;