프로젝트 태스크의 ID, 시작 일자, 종료 일자를 담은 Project라는 테이블이 있다. 시작 일자와 종료 일자는 행마다 1일씩 차이 난다.
- 태스크의 종료 일자가 연속적consecutive이라면, 같은 프로젝트다.
- 모두 다른 프로젝트의 총 갯수를 구하라.
- 프로젝트들의 시작 일자와 종료 일자를 출력하는 쿼리를 작성해라.
- 소요 기간에 따라 오름차순으로 정렬하라, 동일한 값이 있다면 시작 일자 순으로 정렬
문제 풀이 순서
1. 프로젝트 시작 일자들을 start_date 칼럼에서 구한다. start_date 데이터 중 end_date 칼럼에 값이 없으면 그들이다.
2. 프로젝트 종료 일자들을 end_date 칼럼에서 구한다. end_date 데이터 중 start_date 칼럼에 값이 없으면 그들이다.
3. 시작 일자만 있는 테이블과, 종료 일자만 있는 테이블 2개를 1:1 대응하여 join한다. (여기서 많은 시간을 소요했다..)
4. 마지막으로 프로젝트 duration 기준으로 정렬하기 위해 duration 변수를 만든다.
project_id
라는 index를 만들어 두 테이블을 연결했다. -- 나는 변수를 3개 썼는데, 더 좋은 방법이 있을 거 같다.
set @project_id = 0;
set @project_idx = 0;
set @duration = 0;
select p.start_date, m.end_date
from (select end_date, @project_id:= @project_id+1 as pro_index
from projects
where end_date not in (select start_date from projects))as m
join (select start_date, @project_idx:= @project_idx+1 as pro_idx
from projects
where start_date not in (select end_date from projects))as p
on m.pro_index = p.pro_idx
order by @duration:= m.end_date - p.start_date