Проблема в датах начала и окончания при использовании CTE

У меня есть ввод ниже

ID  Activity    Date
1   gardening   2011-01-01 00:00:00.000
1   gardening   2011-02-01 00:00:00.000
2   cooking 2011-03-01 00:00:00.000
2   cooking 2011-04-01 00:00:00.000
2   cooking 2011-05-01 00:00:00.000
1   gardening   2011-06-01 00:00:00.000
1   gardening   2011-07-01 00:00:00.000

Ddl как под

Declare @t table(ID int,Activity Varchar(50),[Date] DATETIME)
Insert into @t Select 1,'gardening','01/01/2011' union all Select 1,'gardening','02/01/2011' 
union all Select 2,'cooking','03/01/2011' union all Select 2,'cooking','04/01/2011'
union all Select 2,'cooking','05/01/2011' union all Select 1,'gardening','06/01/2011'
union all Select 1,'gardening','07/01/2011' 

select * from @t 

Ожидаемый результат

ID ACTIVITY     INITIAL_DATE  END_DATE 
1  gardening    01/01/2011    02/01/2011 
1  gardening    02/01/2011    06/01/2011 
1  gardening    06/01/2011    07/01/2011 
2  cooking      03/01/2011    04/01/2011 
2  cooking      04/01/2011    05/01/2011 

Пока я сделал

;with cte as(Select Rn= ROW_NUMBER() Over(order by ID,[Date]),* from @t)
,cte2 as(
Select Rn
,ID,Activity,InitialDate =[Date],EndDate = [Date] 
from cte where Rn =1
union all
Select c1.Rn
,c1.ID,c1.Activity,c1.Date,c1.Date
from cte2 c2
join cte c1
on c1.rn  = c2.Rn+1

)
select ID,Activity,InitialDate,EndDate from cte2

но вывод неверен

ID  Activity    InitialDate EndDate
1   gardening   2011-01-01 00:00:00.000 2011-01-01 00:00:00.000
1   gardening   2011-02-01 00:00:00.000 2011-02-01 00:00:00.000
1   gardening   2011-06-01 00:00:00.000 2011-06-01 00:00:00.000
1   gardening   2011-07-01 00:00:00.000 2011-07-01 00:00:00.000
2   cooking 2011-03-01 00:00:00.000 2011-03-01 00:00:00.000
2   cooking 2011-04-01 00:00:00.000 2011-04-01 00:00:00.000
2   cooking 2011-05-01 00:00:00.000 2011-05-01 00:00:00.000

Нужна помощь


person aditi    schedule 04.07.2011    source источник


Ответы (2)


попробуй это -

в оракуле он дает желаемый результат. проверьте соответствующую функцию сервера sql для lead () в базе данных оракула

with cte as(Select * from @t) 
(
SELECT * from 
(
SELECT id,activity,
   lead(date) over(partition be id,activity order by date desc) INITIAL_DATE,
   date END_DATE  
from cte 
order by id,activity,date
)
WHERE INITIAL_DATE is not null 
)
person pratik garg    schedule 04.07.2011

person    schedule
comment
Эрикссон хорошая идея :) я так не думал .. спасибо предоставил новую опцию - person pratik garg; 04.07.2011
comment
@pratik - В SQL Server нет функции lead, поэтому я думаю, поэтому я так думаю :). - person Mikael Eriksson; 04.07.2011
comment
охх к ... я не знал о соответствующей функции на сервере sql .. :) - person pratik garg; 04.07.2011