본문 바로가기

카테고리 없음

[SQL 코딩테스트] 해커랭크 Advanced Join 정답

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 연산자 다음에는 값의 목록이 오는 것이 기본이고, 그걸 뽑아주는 대신 서브쿼리한테 시킬 수 있는 것 뿐.

다시 잘 기억하고 넘어가자!