You are given a table, Projects, containing three columns: Task_ID, Start_Date and End_Date. It is guaranteed that the difference between the End_Date and the Start_Date is equal to 1 day for each row in the table.
If the End_Date of the tasks are consecutive, then they are part of the same project. Samantha is interested in finding the total number of different projects completed.
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. If there is more than one project that have the same number of completion days, then order by the start date of the project.
2015-10-28 2015-10-29
2015-10-30 2015-10-31
2015-10-13 2015-10-15
2015-10-01 2015-10-04
select min(start_date) s, end_date
from (select connect_by_root start_date as start_date, end_date
from projects
where connect_by_isleaf=1
start with prior end_date !=start_date
connect by prior end_date=start_date)
group by end_date
order by end_date-s, s;
셀프 조인을 이용해야 할지, 계층쿼리를 이용해야 할지 고민을 많이 했다.
처음에는 계층 쿼리를 사용했었는데, start with
절에서 다른 날짜들을 어떻게 받아올까 고민을 많이 했었다.
그러다 결국 10월 1일과 같은 것은 이전 컬럼이 자신의 start_date와 같은 게 없기 때문에 prior end_date!=start_date
로 해주었다.
지금 보니, 저기서 정렬을 해주는게 더 빠르게 나왔을 것 같기도 하고..
아무튼 그 다음 순방향 쿼리
로 작성해준 인라인 뷰를 가지고 end_date
를 기준으로 그룹핑 해서 제일 앞 날짜인 min(start_date)
를 추출했다.