[HackerRank/Sql] Projects

less than 1 minute read

문제정보

어떻게 풀까?

연속된 날짜로 등록된 것은 하나의 프로젝트로 인식하여 조회하는 문제이다.

다이어그램을 그리고 생각해본다. 시작일과 종료일이 같아 연결이 되는 케이스를 제거하면 나머지는 별도의 프로젝트가 되는 각각의 시작일과 종료일 케이스가 남는다.

이 것을 START_DATE로 Grouping하고 END_DATE는 MIN()값을 구하면 한 START_DATE에 가장 작은 단위의 END_DATE를 가진 케이스들이 조회된다.

연결을 시킨 뒤 조회하려는 접근이 아니라, 연결이 되는 케이스를 제거하여 별도로 셀 수 있는 케이스만 남기는 것이다.

문제풀이 (Oracle)

SELECT START_DATE, MIN(END_DATE) FROM 
(SELECT START_DATE FROM PROJECTS WHERE START_DATE NOT IN (SELECT END_DATE FROM PROJECTS)) A,
(SELECT END_DATE FROM PROJECTS WHERE END_DATE NOT IN (SELECT START_DATE FROM PROJECTS)) B
WHERE START_DATE < END_DATE
GROUP BY START_DATE
ORDER BY MIN(END_DATE) - START_DATE, START_DATE;

Leave a comment