본문 바로가기

IT Data 분석

[SQL] HackerRank PROJECT PLANNING

728x90

Task_ID , Start_Date  End_Date 열이 포함된 Projects 테이블이 제공 됩니다. End_Date  Start_Date 의 차이는 테이블의 각 행에 대해 1 일임을 보장합니다.

작업의 End_Date  연속적이면 동일한 프로젝트의 일부입니다. Samantha는 완료된 서로 다른 프로젝트의 총 수를 찾는 데 관심이 있습니다.

프로젝트를 완료하는 데 걸린 일 수로 나열된 프로젝트의 시작 날짜와 종료 날짜를 오름차순으로 출력하는 쿼리를 작성하십시오. 완료 일수가 동일한 프로젝트가 두 개 이상 있는 경우 프로젝트 시작 날짜를 기준으로 주문하십시오.

 

 

샘플 입력

샘플 출력

2015-10-28 2015-10-29
2015-10-30 2015-10-31
2015-10-13 2015-10-15
2015-10-01 2015-10-04


설명

이 예에서는 다음 네 가지 프로젝트를 설명합니다.

  • 프로젝트 1 : 작업 1 , 2 , 3 은 연속된 날에 완료되므로 프로젝트의 일부입니다. 따라서 프로젝트의 시작 날짜는 2015-10-01 이고 종료 날짜는 2015-10-04 이므로 프로젝트를 완료하는 데 3일 이 걸렸습니다.
  • 프로젝트 2 : 작업 4  와  5  는 연속된 날에 완료되므로 프로젝트의 일부입니다. 따라서 프로젝트의 시작 날짜는  2015-10-13  이고 종료 날짜는  2015-10-15 이므로   프로젝트를 완료하는 데 2일 이 걸렸습니다.
  • 프로젝트 3 : 작업 6 만  프로젝트의 일부입니다. 따라서 프로젝트의 시작 날짜는  2015-10-28  이고 종료 날짜는  2015-10-29 이므로   프로젝트를 완료하는 데 1일 이 걸렸습니다.
  • 프로젝트 4 : 작업  7 만  프로젝트의 일부입니다. 따라서 프로젝트의 시작 날짜는  2015-10-30  이고 종료 날짜는  2015-10-31 이므로   프로젝트를 완료하는 데 1일 이 걸렸습니다.

 

<조건정리>

1) Start_Date 에 End_Date가 들어있으면 최종 프로젝트 시작 날짜가 아니다 

2) End_Date에 Start_Date이 들어있으면 최종 프로젝트 종료 날짜가 아니다 

3) 완료 일수를 계산해야함 (Datediff, MIN 함수 이용) -> 정렬에 사용 

 

1),2)를 반영한 코드 

SELECT START_DATE, 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
ORDER BY START_DATE

 

여기서 START_DATE < END_DATE이어야 한다는 조건을 추가해준다. 

SELECT START_DATE, 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
ORDER BY START_DATE, END_DATE

 

3) 여러 END_DATE 중에 결국 최솟값으로 선택해야한다는 아이디어를 생각해야한다. 

  • MIN() 함수를 사용하기 위해서는 GROUP BY 를 해줘야 하는데, 시작날짜가 동일하니까, 시작날짜를 기준으로 그룹핑한다. 
  • 또한 DATEDIFF 함수를 이용해서 가장 프로젝트 완료일자가 짧은 순대로 정렬, START_DATE이 빠른순대로 정렬
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