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