본문 바로가기

SQL/HackerRank (SQL문풀)

HackerRank / Advanced Join / SQL Project Planning / MySQL

728x90

📚문제

https://www.hackerrank.com/challenges/sql-projects/problem?isFullScreen=true

 

SQL Project Planning | HackerRank

Write a query to output the start and end dates of projects listed by the number of days it took to complete the project in ascending order.

www.hackerrank.com

문제 내용이 길어서 링크로 첨부

 

📝풀이

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 DATEDIFF(MIN(End_Date),Start_Date), Start_Date

풀이는 구글링하여 참고

End_Date에 들어가있지 않은 Start_Date를 고른다는것이 참신한 아이디어같다

 

Start_Date가 End_Date에 들어가있지 않다면

연속된 프로젝트가 아닌

새 프로젝트의 시작날짜라는 이야기이다

End_Date도 마찬가지

 

이렇게 나온 두 테이블을 

카티션곱(Cross JOIN)한 다음에

프로젝트의 종료 시점이 시작 시점보다 늦는 경우만 가져오기

 

그 다음 시작 시점으로 그룹화하여

가장 작은 종료 시점을 가져오기

(이 종료시점이 프로젝트의 시작부터 종료까지 연속된 기간을 의미)

 

그리고 주의할 점은

ORDER BY할 때

그룹화 해준 열 / 집계된 열

만을 사용해주어야 한다

 

그렇지않으면 다음과 같은 에러 발생

 

728x90