SQL Project Planning

  • + 1 comment

    I used window functions in my solution:

    with ordered_dates as ( select task_id , start_date , end_date , lag(end_date) over (order by end_date) as last_end_date , lead(start_date) over (order by start_date) as next_start_date from projects ), start_dates_tables as ( select case when datediff(day, last_end_date, end_date) > 1 or datediff(day, last_end_date, end_date) is null then start_date end as project_start_date
    from ordered_dates ), ranked_start_dates as ( select project_start_date , rank() over (order by project_start_date) as rank from start_dates_tables
    where project_start_date is not null ), end_dates_table as ( select case when datediff(day, start_date, next_start_date) > 1 or datediff(day, start_date, next_start_date) is null then end_date end as project_end_date from ordered_dates ), ranked_end_dates as ( select project_end_date , rank() over (order by project_end_date) as rank from end_dates_table
    where project_end_date is not null ) select project_start_date , project_end_date from ranked_start_dates s inner join ranked_end_dates e on e.rank = s.rank order by datediff(day, project_start_date, project_end_date), project_start_date