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을 사용해서 그룹화하듯이 해결할 수 있음. 다음에 다시 풀어보자고