SQL Project Planning
⏰ 21:35
와 이건 어떻게 풀어야 하나 백지를 눈앞에 두고 한참 고민했는데, 무작정 조인을 걸 게 아니라 WHERE NOT IN 구문을 이용해 쉽게 풀 수 있었다.
1) END_DATE에 없는 START_DATE를 찾으면 그게 한 프로젝트의 시작일
2) START_DATE에 없는 END_DATE를 찾으면 그게 한 프로젝트의 종료일
3) 두 프로젝트가 같은 프로젝트임을 ROW_NUMBER로 나타내고 묶어주기
WITH A AS (
SELECT START_DATE, ROW_NUMBER() OVER (ORDER BY START_DATE) AS NUM
FROM PROJECTS
WHERE START_DATE NOT IN (SELECT END_DATE FROM PROJECTS)
)
, B AS (
SELECT END_DATE, ROW_NUMBER() OVER (ORDER BY END_DATE) AS NUM
FROM PROJECTS
WHERE END_DATE NOT IN (SELECT START_DATE FROM PROJECTS)
)
SELECT START_DATE, END_DATE
FROM A
JOIN B
USING (NUM)
ORDER BY DATEDIFF(END_DATE, START_DATE), START_DATE
갑자기 WHERE 절 IN 뒤에 그냥 간단히 END_DATE를 쓰면 왜 안되지? 하고 챗 GPT에 물어봤더니...
당연한 거였는데 늘 당연하게 쓰다보니 갑자기 헷갈렸다.
IN 연산자 다음에는 값의 목록이 오는 것이 기본이고, 그걸 뽑아주는 대신 서브쿼리한테 시킬 수 있는 것 뿐.
다시 잘 기억하고 넘어가자!