Mysql 欢迎来到SO!虽然这段代码可以回答这个问题,但提供关于它如何和/或为什么解决问题的附加上下文将提高答案的长期价值。请阅读,然后 set @r := 0; select min(start_date), max(end_date) from (select

Mysql 欢迎来到SO!虽然这段代码可以回答这个问题,但提供关于它如何和/或为什么解决问题的附加上下文将提高答案的长期价值。请阅读,然后 set @r := 0; select min(start_date), max(end_date) from (select ,mysql,Mysql,欢迎来到SO!虽然这段代码可以回答这个问题,但提供关于它如何和/或为什么解决问题的附加上下文将提高答案的长期价值。请阅读,然后 set @r := 0; select min(start_date), max(end_date) from (select start_date, end_date, @r := if(datediff(end_date, @e) = 1, @r, @r+1) ranking, @e := end_date from proje

欢迎来到SO!虽然这段代码可以回答这个问题,但提供关于它如何和/或为什么解决问题的附加上下文将提高答案的长期价值。请阅读,然后
set @r := 0;
select min(start_date), max(end_date)
from (select start_date, end_date, 
      @r := if(datediff(end_date, @e) = 1, @r, @r+1) ranking,
      @e := end_date
      from projects
      order by start_date
     ) b
group by ranking
order by datediff(max(end_date), min(start_date)), 1
;
set @r = 0;
select start_date, end_date, 
@e := end_date, datediff(end_date, date(@e)),
@r := if(datediff(end_date, date(@e)), @r, @r+1) ranking
from projects
order by start_date
;
2015-10-01 2015-10-02 2015-10-02 0 1 
2015-10-02 2015-10-03 2015-10-03 0 2 
2015-10-03 2015-10-04 2015-10-04 0 3 
2015-10-04 2015-10-05 2015-10-05 0 4 
2015-10-11 2015-10-12 2015-10-12 0 5 
2015-10-12 2015-10-13 2015-10-13 0 6 
2015-10-15 2015-10-16 2015-10-16 0 7 
2015-10-17 2015-10-18 2015-10-18 0 8 
2015-10-19 2015-10-20 2015-10-20 0 9 
select start_date, end_date,@e := end_date, datediff(end_date, date(@e)),
      @r := if(end_date-@e = 1, @r, @r+1) ranking,

      from projects
      order by start_date
;
set @r = 0;
set @e = (select max(end_date) from projects);
select min(start_date), max(end_date)
from (
    select start_date, end_date, 
    @r := if(datediff(end_date, date(@e)) = 1, @r, @r+1) ranking,
    @e := end_date
    from projects
    order by start_date
    ) b
group by ranking
order by datediff(max(end_date), min(start_date)), 1
;
SELECT min(start_date), max(end_date)
FROM (select start_date, end_date, 
      @r := if(datediff(end_date, @e) = 1, @r, @r+1) ranking,
      @e := end_date as ee
      FROM projects
      CROSS JOIN ( SELECT @r:=0, @e:='1970-01-01') as init
      ORDER BY start_date
     ) b
GROUP BY ranking
ORDER BY datediff(max(end_date), min(start_date));
2015-10-15 2015-10-16 
2015-10-17 2015-10-18 
2015-10-19 2015-10-20 
2015-10-21 2015-10-22 
2015-11-01 2015-11-02 
2015-11-17 2015-11-18 
2015-10-11 2015-10-13 
2015-11-11 2015-11-13 
2015-10-01 2015-10-05 
2015-11-04 2015-11-08 
2015-10-25 2015-10-31 
SELECT SD,ED
FROM
(SELECT MIN(START_DATE) SD, MAX(END_DATE) ED, ( MAX(END_DATE)-MIN(START_DATE)) dd
FROM
(
SELECT  START_DATE, END_DATE, END_DATE - ROW_NUMBER() OVER (ORDER BY END_DATE) DIST
FROM PROJECTS
 ORDER BY 1)
GROUP BY DIST
 ORDER BY 3,1);
SELECT Start_Date, min(End_Date)
FROM 
 (SELECT Start_Date FROM Projects WHERE Start_Date NOT IN (SELECT End_Date FROM Projects)) a ,
 (SELECT End_Date FROM Projects WHERE End_Date NOT IN (SELECT Start_Date FROM Projects)) b
WHERE Start_Date < End_Date
GROUP BY Start_Date
ORDER BY DATEDIFF(min(End_Date), Start_Date) ASC, Start_Date ASC;
/* Below is my Solution */


select Min_Start_Date,Max_End_Date
from (
select distinct 
       min(start_date) over (partition by Ref_Start_date) as Min_Start_Date,
       max(End_Date) over (Partition by Ref_End_Date) as Max_End_Date,
       count(*) over (partition by Ref_Start_date,Ref_End_Date) as CNT
from (
        select 
        start_date,
        start_date+dense_rank() over (order by start_date desc) as Ref_Start_date, 
        end_date,
        End_date+dense_rank() over (order by End_date desc) as Ref_End_date
        from projects
    )
 order by 3,1
);
select * , row_number() over (order by start_date) rn into #temp 
from projects
order by start_date

declare @counter int = 2
declare @e_date date = (select min(end_date) from #temp)

while @counter <= (select max(rn) from #temp)
begin
    if @e_date = (select start_date from #temp where rn = @counter)
    begin
        update #temp
        set start_date = (select start_date from #temp where rn = @counter -1 )
        where rn = @counter

        delete from #temp
        where rn = @counter - 1

        set @e_date = (select end_date from #temp where rn = @counter)
    end
else
    begin
        set @e_date = (select end_date from #temp where rn = @counter)
    end

     set @counter = @counter + 1
end


select start_date , end_date from #temp
order by datediff(day , start_date , end_date) , start_date
SELECT         START_DATE, MIN(END_DATE) AS [END_DATE]
    FROM       (
                    (SELECT         START_DATE 
                            FROM    PROJECTS 
                            WHERE   START_DATE NOT IN (SELECT END_DATE FROM PROJECTS)
                    ) A
                    CROSS JOIN
                    (SELECT        END_DATE 
                            FROM   PROJECTS 
                            WHERE  END_DATE NOT IN (SELECT START_DATE FROM PROJECTS)
                    ) B
               )     
    WHERE      START_DATE < END_DATE
    GROUP BY   START_DATE
    ORDER BY   DATEDIFF(DAY, MIN(END_DATE), START_DATE) DESC, CAST(START_DATE AS DATE) ASC
select Min_Start_Date,Max_End_Date

from (

select distinct
 
       min(start_date) over (partition by Ref_Start_date) as Min_Start_Date,

       max(End_Date) over (Partition by Ref_End_Date) as Max_End_Date,

       count(*) over (partition by Ref_Start_date,Ref_End_Date) as CNT

from (

        select 

        start_date,

        start_date+dense_rank() over (order by start_date desc) as Ref_Start_date, 

        end_date,

        End_date+dense_rank() over (order by End_date desc) as Ref_End_date

        from projects

    )

 order by 3,1
);
select start_Date,end_date from (
select start_Date,end_date,datediff(day,start_Date,end_date)as diff1 from 
(
select start_Date,row_number() over (order by start_Date) as rn from
(select start_date from projects
where start_date not in (select distinct end_date from projects)
) t1)t1a

left join 
(select end_date,row_number() over (order by end_date) as rn from
(select end_date from projects
where end_date not in (select distinct start_date from projects)
) t2)t2a

on t1a.rn=t2a.rn )tx
order by diff1 , start_date