𝙎𝙌𝙇
[HackerRank] SQL Project Planning
콜라맛갈비
2023. 7. 26. 17:35
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
주어진 테이블에 start_date와 end_date라는 컬럼이 있는데,
같은 행의 두 원소는 무조건 하루가 차이 난다.
이때, 연속하는 날짜의 행은 같은 프로젝트이다.
프로젝트가 시작하는 날짜와 끝나는 날짜를 찾고 걸린 기간에 따라 정렬하기!
WITH LEAD_TABLE AS(
SELECT *
, LEAD(start_date) OVER (ORDER BY start_date) NEXT
FROM Projects
),
SAME_TABLE AS (
SELECT *
, IF(END_DATE=NEXT, 'YES', 'NO') SAME
FROM LEAD_TABLE
)
SELECT *
FROM SAME_TABLE
LEAD 함수 썼다가 흠... 도저히 안풀려서
다른 분이 하신 힌트 참고하기!!
- START_DATE 중 END_DATE에는 없는 START_DATE는 각 연속적이지 않고 개별적으로 시작하는 프로젝트의 시작 날짜를 의미
- END_DATE 중 START_DATE에는 없는 END_DATE는 각 연속적이지 않고 개별적으로 시작하는 프로젝트의 종료날짜를 의미
WITH SD AS(SELECT START_DATE
, ROW_NUMBER() OVER (ORDER BY START_DATE) RN
FROM Projects
WHERE START_DATE NOT IN (
SELECT DISTINCT END_DATE
FROM Projects
))
, ED AS(SELECT END_DATE
, ROW_NUMBER() OVER (ORDER BY END_DATE) RN
FROM Projects
WHERE END_DATE NOT IN (
SELECT DISTINCT START_DATE
FROM Projects
))
SELECT START_DATE
, END_DATE
FROM SD JOIN ED ON SD.RN = ED.RN
ORDER BY (END_DATE - START_DATE), START_DATE
내가 짠 코드!
ROW_NUMBER를 통해 행번호를 매겨서 좌우로 테이블을 붙였다.
다른 분들이 하신 코드도 공부해봤다.
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
728x90