1

以下の形式のデータを含むテーブルがあります。

ProjID   ProjName    RefDate    
-------- ----------- ---------- 
1        A           08/02/2013 
1        A           08/03/2013 
1        A           08/15/2013 
2        B           08/02/2013 
2        B           08/03/2013 
2        B           08/15/2013 
2        B           08/20/2013 

以下のような結果セットが必要です。

ProjID   ProjName    StartDate  EndDate    
-------- ----------- ---------- ------------
1        A           08/02/2013 08/02/2013 
1        A           08/02/2013 08/03/2013
1        A           08/03/2013 08/15/2013
2        B           08/02/2013 08/02/2013
2        B           08/02/2013 08/16/2013 
2        B           08/16/2013 08/20/2013 
2        B           08/20/2013 08/22/2013

StartDate は、前の行の refdate からコピーされます。

上記の結果セットを作成する TSQL ステートメントを作成するにはどうすればよいですか? 私は反復を行うことができますが、それは最適な方法ではありません。

4

2 に答える 2

1

SQL Server 2005/2008 を使用している場合は、これを試すことができます

;with cte as
(
  select *,
  row_number() over (partition by projid order by refdate) rn
  from projects
)
select c.projid, c.projname,
coalesce(l.refdate, c.refdate) as startdate,
c.refdate as enddate
from cte c
left outer join cte l 
  on c.projid = l.projid and (c.rn -1) = l.rn
order by 1,3,4

SQLデモ

SQL Server 2012は、同じ結果を得るために使用できるLAG関数をサポートします

select 
c.projid, c.projname,
coalesce(lag(c.refdate)
         over (partition by projid 
               order by refdate),c.refdate)
as startdate,
c.refdate as enddate
from projects c
order by 1,3,4;

2012 年の SQL デモ

于 2013-08-28T04:53:00.170 に答える