본문 바로가기

Language/SQL

[HackerRank][SQL][JOIN] Advanced Join, SQL Project Planning - 컴도리돌이

728x90
728x90
반응형
 

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


Problem

If the End_Date of the tasks are consecutive, then they are part of the same project. Samantha is interested in finding the total number of different projects completed.

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. If there is more than one project that have the same number of completion days, then order by the start date of the project.

 

-> 연속되는 날짜는 같은 프로젝트로 여긴다. (연속되는 날짜는 프로젝트 끝나는 시간과 시작하는 시간이 같을 경우) 

프로젝트의 시작 시간과 끝나는 시간을 출력한다. 출력할 때는 프로젝트 기간이 짧은 순으로, 기간이 동일하면 프로젝트 시작 시간이 빠른 순으로 정렬해서 출력한다.


Answer

select start_date,min(end_date)
from (select start_date from projects 
      where start_date not in (select end_date from projects)) a 
      inner join 
      (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;

 

1. Table a는 시작 시간이 끝나는 시간에 포함되지 않은 프로젝트를 갖고 있다. 그러므로 2,3,5 프로젝트를 제외한 시작 시간을 갖고 있다.

2. Table b는 끝나는 시간이 시작 시간에 포함되지 않은 프로젝트를 갖고 있다. 그러므로 1,2,4 프로젝트를 제외한 끝나는 시간을 갖고 있다.

3. a와 b를 join을 시켜줘서 a와 b의 모든 조합을 생성해준다. 여기서 당연히 시작 시간이 끝나는 시간보다 작은 값을 조건(where)에 설정한다.

4. 시작 시간을 그룹화해주고 , 그룹화 한 시간 중에서 가장 작은 끝나는 시간과 시작시간이 차가 짧은 순(프로젝트 기간), 시작시간이 짧은 순으로 정렬시켜준다.

728x90
728x90