2016-12-15 2 views
0

Каждая строка моей таблицы содержит ссылку и дату. Я пытаюсь найти количество дней между одной датой и предыдущей. работаРазница между двумя последовательными датами, хранящаяся в отдельных строках

Давайте на примере ниже:

CREATE TABLE #Test 
( 
    Ref NVARCHAR(100) NOT NULL, 
    Dat DATETIME NOT NULL 
) 

INSERT INTO #Test (Ref, Dat) 
VALUES (N'ABC123', GETDATE()), 
     (N'DHI458', GETDATE() + 1), 
     (N'HGYU556', GETDATE() - 3), 
     (N'UUU021', GETDATE() + 17) 

Я пытаюсь получить что-то вроде:

UUU021 2017-01-01 17:27:00.720 17 
DHI458 2016-12-16 17:27:00.720 1 
ABC123 2016-12-15 17:27:00.720 3 
HGYU556 2016-12-12 17:27:00.720 NULL 

в один выбор. Является ли это возможным? Я работаю с SQL Server 2008.

ответ

2

SQL Server 2012+ поддерживает lag(). В SQL Server 2008 у вас есть несколько вариантов - ничего действительно хорошего. Я бы с outer apply:

select t.*, 
     datediff(day, tprev.date, t.date) as diff 
from #test t outer apply 
    (select top 1 t2.* 
     from #test t2 
     where t2.date < t.date 
     order by t2.date desc 
    ) tprev; 
0

подход Гордона является твердой, но вот еще

with CTE as 
(
select Ref, Dat, row_number() over (order by Dat desc) as DatO 
from #Test 
) 
select A1.Ref, A1.Dat, A1.Dat-A2.Dat as Diff 
from CTE A1 
left join CTE A2 
    on A1.DatO = A2.DatO - 1; 
0

Я вообще люблю автообъединение, пока вы не эффективно 2 таблицы, смещенные на 1 строку:

select t1.Ref, t1.Dat. datediff(dd, t1.Dat, t2.Dat) as diff 
from #Test as t1 
inner join #Test as t2 
on t2.Dat > t1.Dat 
and not exists (
    select 1 
    from #Test as t3 
    where t3.Dat > t1.Dat 
    and t3.Dat < t2.Dat 
    ) 
order by t1.Dat desc 
Смежные вопросы