본문 바로가기
데이터관련공부/SQL

[HackerRank] SQL - Project Planning

by 자유롭고 싶은 키털트 2022. 10. 9.

https://www.hackerrank.com/challenges/sql-projects/problem

 

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

 

1. 설명: 

-하기와 같이 TASK_ID, Start_DATE, End_Date 가 있는 Projects 라는 테이블이 있다. 

-End Date 가 연속적이라면 같은 프로젝트

: 예를 들어 하기 Sample Output 의 Task_ID 1, 2, 3 은 같은 프로젝트, 이 때 최종 End_Date 는 10/4일 Start_Date 는 10/1 이 됨, 그러므로 소요된 날짜도 3일이다. 

: 마찬가지로 Task_ID 는 4, 5도 같은 프로젝트, 이 때 소요된 날짜는 2일

 

2. 문제: 

-각각 개별 프로젝트들이 완료되기까지 소요된 날짜를 구하라

1) 최종 결과에는 프로젝트별 Start Date 와 End Date 를 구하되, 완료되기까지 소요된 날짜 순으로 오름차순 정렬

2) 같은 소요기간이 걸린 프로젝트의 경우, 해당 프로젝트의 Start Date 로 정렬하라

 

Sample Input

처음 스타트 하기까지 너무 아이디어가 안나와서 Discussion 을 참고 하였다...........

 

3. 풀이

- ROW_NUMBER() OVER 함수를 알아야 함....

: 말 그대로 일련 번호를 부여 하는 함수이되, 무엇을 가지고 정렬해서 일련 번호를 부여할지 정할 수 있는 듯..

: 이 예시에서는 Start_Date 칼럼

- 이 함수를 가지고 같은 프로젝트임을 명시해줄 수 있는 칼럼을 하나 만들어야 함

 

 

The syntax for ROW_NUMBER function in SQL is as follows

 

ROW_NUMBER() OVER (

    [PARTITION BY expr1, expr2,...]

    ORDER BY expr1 [ASC | DESC], expr2,...

)

 

1) 첫번째 방법

SELECT MIN(Start_Date), MAX(End_Date)
FROM
(SELECT
        Start_Date,
        End_Date,
        ROW_NUMBER() OVER (ORDER BY Start_date),
        End_Date - ROW_NUMBER() OVER (ORDER BY Start_date) AS Same_Project  // 같은 프로젝트를 명시하는 칼럼을 하나 만든다 
    FROM
        Projects) P
GROUP BY Same_Project // 같은 프로젝트별로 GROUP BY 를 한다
ORDER BY MAX(End_Date)-MIN(Start_Date), MIN(Start_Date) // End_Date 의 최대에서 Start_Date 의 최소를 빼면 소요 기간, 이 소요기간 별로 오름차순

 

2) 두번째 방법

WITH
  partitioned AS
  (
    SELECT
      *
    , DATEDIFF(Start_Date, '2001-01-01') - ROW_NUMBER() OVER (ORDER BY start_Date) AS PartID
    FROM
      Projects
  )
SELECT
  MIN(Start_Date) AS StartDate
, MAX(End_date) AS EndDate
FROM
  partitioned
GROUP BY
  PartID
ORDER BY 
  DATEDIFF(MAX(End_Date), MIN(Start_Date))

반응형