2016-12-15 3 views
0

テーブルの各行には参照と日付が含まれています。ある日付と前の日付の間の日数を調べようとしています。以下の例で2つの連続する日付の差異、別々の行に格納

レッツ・仕事:単一選択に

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 

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) 

は、私のような何かを取得しようとしています。出来ますか?私はSQL Server 2008で作業しています。

答えて

2

lag()をサポートしています。 SQL Server 2008にはいくつかのオプションがあります。

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

ゴードンのアプローチは固体であるが、ここであなたは1行で相殺されている効果的に2つのテーブル持ってまで、私は一般的に好きな別の

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

自己の参加だ:私はouter applyとなるだろう

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 
関連する問題