Я понимаю, что вам нужна разница между первой датой status_date и следующей датой status_date для того же идентификатора и т. Д. Вплоть до closed_date.
Это будет работать только в SQL 2005 и более поздних версиях.
;with test as (
select
key,
id_number,
status,
received_date,
status_date,
closed_date,
row_number() over (partition by id order by status_date, key ) as rownum
from @test
)
select
t1.key,
t1.id_number,
t1.status,
t1.status_date,
t1.received_date,
t1.closed_date,
datediff(d, case when t1.rownum = 1
then t1.received_date
else
case when t2.status_date is null
then t1.closed_date
else t2.status_date
end
end,
t1.status_date
) as days
from test t1
left outer join test t2
on t1.id = t2.id
and t2.rownum = t1.rownum - 1
Это решение будет работать с SQL 2000, но я не уверен, насколько хорошо оно будет работать:
select *,
datediff(d,
case when prev_date is null
then closed_date
else prev_date
end,
status_date )
from (
select *,
isnull( ( select top 1 t2.status_date
from @test t2
where t1.id_number = t2.id_number
and t2.status_date < t1.status_date
order by t2.status_date desc
),received_date) as prev_date
from @test t1
) a
order by id_number, status_date
Примечание : замените таблицу @Test именем вашей таблицы.