𝙎𝙌𝙇

[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