2013-08-28 31 views
1

我有對以下格式的數據表:獲取前行的RefToDate成爲下一行的RefFromDate TSQL

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語句提出上述結果集?我可以做一個迭代,但它不是做IMHO的最佳方式。

+1

是有辦法找出明確地一桌子的一排? –

+0

你是什麼意思?一個唯一的列ID? – user1505676

+0

如果數據在表中未排序如何知道下一行是哪一行? – Justin

回答

1

如果您運行SQL2005或更高版本,可以

  • self join挑下一個日期
  • union第一行對每個項目

是這樣的:

; 
WITH ProjectDataRanked 
     AS (SELECT ProjID , 
        ProjName , 
        RefDate , 
        ROW_NUMBER() OVER (PARTITION BY ProjID, ProjName ORDER BY RefDate) RN 
      FROM  ProjectData 
     ) 
SELECT ProjectData.ProjID , 
     ProjectData.ProjName , 
     ProjectData.RefDate AS StartDate , 
     MIN(ProjectDataNext.RefDate) AS EndDate 
FROM ProjectData 
     INNER JOIN ProjectData ProjectDataNext ON ProjectData.ProjID = ProjectDataNext.ProjID 
                AND ProjectData.ProjName = ProjectDataNext.ProjName 
                AND ProjectData.RefDate > ProjectDataNext.RefDate 
GROUP BY ProjectData.ProjID , 
     ProjectData.ProjName , 
     ProjectData.RefDate 
UNION 
SELECT ProjID , 
     ProjName , 
     RefDate AS StartDate , 
     RefDate AS EndDate 
FROM ProjectDataRanked 
WHERE RN = 1 
ORDER BY ProjID , 
     ProjName , 
     StartDate , 
     EndDate 
+0

SQL語句有效,但將ProjectData.RefDate> ProjectDataNext.RefDate更改爲ProjectData.RefDate user1505676

+0

ups抱歉...錯誤的方向。 –

1

如果您使用的是SQL Server 2005/2008, n您可以試試這個

;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 DEMO

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; 

SQL DEMO for 2012