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
'IT Data 분석' 카테고리의 다른 글
[SQL] HackerRank Weather Observation Station 18 (0) | 2022.11.07 |
---|---|
[MySQL] 콤마가 포함된 텍스트 타입 컬럼을 숫자형 컬럼으로 변경하기 / 가격 데이터를 숫자 데이터로 변경하기 (0) | 2022.11.06 |
[SQL] Hackerrank Symmetric Pairs (0) | 2022.11.06 |
[SQL] HackerRank Placements (0) | 2022.11.06 |
[ADSP] 3과목 데이터분석 - 통계분석 (0) | 2022.10.10 |