홍동이의 성장일기
[HackerRank] SQL Project Planning 본문
SELECT start_date, end_date
FROM (
SELECT ROW_NUMBER() OVER (ORDER BY start_date) as num
, start_date
FROM projects
WHERE start_date NOT IN (SELECT end_date FROM projects)
) s
INNER JOIN
(
SELECT ROW_NUMBER() OVER (ORDER BY end_date) as num
, end_date
FROM projects
WHERE end_date NOT IN (SELECT start_date FROM projects)
) e
ON s.num = e.num
ORDER BY DATEDIFF(end_date, start_date), start_date
💡 문제풀이
예시로 주어진 표에는 4개의 프로젝트가 표현되어 있습니다.
SELECT start_date
FROM projects
WHERE start_date NOT IN (SELECT end_date FROM projects)
start_date는 프로젝트의 시작일로, end_date 열에 포함되지 않습니다.
따라서 WHERE절에 조건을 걸어 프로젝트 시작일을 나타내 줍니다.
SELECT ROW_NUMBER() OVER (ORDER BY start_date) as num
, start_date
FROM projects
WHERE start_date NOT IN (SELECT end_date FROM projects)
프로젝트의 번호를 매겨주기 위해서 ROW_NUMBER을 사용해줍니다.
SELECT ROW_NUMBER() OVER (ORDER BY end_date) as num
, end_date
FROM projects
WHERE end_date NOT IN (SELECT start_date FROM projects)
프로젝트의 마지막날도 시작일과 같은 방식으로 뽑아줍니다.
SELECT *
FROM (
SELECT ROW_NUMBER() OVER (ORDER BY start_date) as num
, start_date
FROM projects
WHERE start_date NOT IN (SELECT end_date FROM projects)
) s
INNER JOIN
(
SELECT ROW_NUMBER() OVER (ORDER BY end_date) as num
, end_date
FROM projects
WHERE end_date NOT IN (SELECT start_date FROM projects)
) e
ON s.num = e.num
num을 기준으로 두개의 테이블을 JOIN해줍니다.
우리에게 필요한 start_date와 end_date만 가져와줍니다.
또한 진행기간이 짧은 프로젝트부터 나타내주어야 하기 때문에 DATEDIFF함수를 사용해 오름차순해줍니다. 프로젝트 기간이 같은 경우 start_date가 빠른 순서대로 나타내줍니다.
📍본 내용은 '[백문이불여일타] 데이터 분석을 위한 고급 SQL 문제풀이'를 수강하며 작성한 내용입니다.
728x90
'Tool > SQL 코딩테스트 풀이' 카테고리의 다른 글
[HackerRank] Weather Observation Station 11 (0) | 2023.10.13 |
---|---|
[HackerRank] Ollivander's Inventory (0) | 2023.10.12 |
[Hacker Rank] Binary Tree Nodes / [LeetCode] 608. Tree Node (1) | 2023.10.12 |
[HackerRank] Weather Observation Station 5 (0) | 2023.10.02 |
[HackerRank] Occupations (1) | 2023.10.02 |
Comments