[HackerRank]SQL Project Planning

주연·2023년 4월 24일
0

SQL 문제 풀이

목록 보기
23/29
post-thumbnail

문제

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

답변

나 틀림...
1) window 함수 LAG를 이용해서 풀려고 함.

SELECT *
    , LAG(end_date) OVER (ORDER BY start_date) lag_date
    , DATEDIFF(lag_date, end_date) diff
FROM Projects
ORDER BY start_date

end_date의 이전 행과 datediff로 계산해 1인 값은 연속적임을 확인하고 같은 그룹으로 묶으려고 했으나 diff값으로 그룹을 만들었을 때 1인 값은 다 같은 그룹으로 묶여 문제 발생.

2) 문제 설명 들은 후
start_date는 end_date에 없고 그 반대도 마찬가지. NOT IN을 사용해서 풀어야하는데 저번 문제에서 NOT IN을 쓰면 서브쿼리의 결과로 나온 모든 값들과 일치하지 않는지를 체크함.

SELECT * 
FROM projects
ORDER BY start_date
WHERE start_date NOT IN (SELECT DISTINCT end_date FROM projects)

그래서 이렇게 작성하다 엉,,,? 이러고 풀이 확인했는데 이렇게 작성하는게 맞았다. 그래도 만약 계속 작성했으면 ROW_NUMBER는 생각도 안해서 틀렸을 거임...

  • 풀이 확인
SELECT start_date
    , end_date
FROM ( ---project의 start_date 추출
    SELECT start_date
        , ROW_NUMBER() OVER (ORDER BY start_date) rnt
    FROM Projects
    WHERE start_date NOT IN (SELECT DISTINCT end_date FROM Projects) 
) s_date 
INNER JOIN ( ---project의 end_date 추출
    SELECT end_date
        , ROW_NUMBER() OVER (ORDER BY end_date) rnt
    FROM Projects
    WHERE end_date NOT IN (SELECT DISTINCT start_date FROM Projects) 
) e_date ON s_date.rnt = e_date.rnt
ORDER BY DATEDIFF(end_date, start_date), start_date

ROW_NUMBER과 JOIN을 사용해서 그룹화하듯이 해결할 수 있음. 다음에 다시 풀어보자고

profile
공부 기록

0개의 댓글