2016-12-15 6 views
0

Jede Zeile meiner Tabelle enthält eine Referenz und ein Datum. Ich versuche die Anzahl der Tage zwischen einem Datum und dem vorherigen zu finden.Unterschied zwischen zwei aufeinanderfolgenden Daten, in separaten Zeilen gespeichert

Lassen Sie uns die Arbeit an dem folgenden Beispiel:

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) 

Ich versuche, wie etwas zu bekommen:

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 

in einem einzigen wählen. Ist es möglich? Ich arbeite mit SQL Server 2008.

Antwort

2

SQL Server 2012 unterstützt lag(). In SQL Server 2008 haben Sie mehrere Optionen - keine wirklich gut. Ich würde mit 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

Gordon Ansatz fest ist, aber hier ist eine andere

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

ich allgemein gerne selbst beitreten, bis Sie effektiv 2 Tabellen haben, die um 1 Zeile versetzt sind:

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 
Verwandte Themen