根据下一行日期值添加Date列

时间:2013-03-01 03:36:04

标签: sql sql-server-2005

我正在使用SQL Server 2005.从下面的tbl_temp表中,我想基于下一行的StartDate减去1天添加一个EndDate列,直到AID和UID组合发生变化。此计算的EndDate将作为EndDate转到它上面的行。 AID和UID组的最后一行将获得系统日期作为其EndDate。该表必须按AID,UID,StartDate顺序排序。谢谢你的帮助。

- tbl_temp

AID     UID     StartDate
1   1   2013-02-20
2   1   2013-02-06
1   1   2013-02-21
1   1   2013-02-27
1   2   2013-02-02
1   2   2013-02-04

- 需要结果

AID     UID     StartDate        EndDate
1   1   2013-02-20       2013-02-20
1   1   2013-02-21       2013-02-26
1   1   2013-02-27       sysdate
1   2   2013-02-02       2013-02-03
1   2   2013-02-04       sysdate
2   1   2013-02-06       sysdate

2 个答案:

答案 0 :(得分:1)

最简单的方法是使用相关的子查询:

select t.*,
       (select top 1 dateadd(day, -1, startDate )
        from tbl_temp t2
        where t2.aid = t.aid and
              t2.uid = t.uid and
              t2.startdate > t.startdate
       ) as endDate
from tbl_temp t

要获取当前日期,请使用isnull()

select t.*,
       isnull((select top 1 dateadd(day, -1, startDate )
               from tbl_temp t2
               where t2.aid = t.aid and
                     t2.uid = t.uid and
                     t2.startdate > t.startdate
               ), getdate()
              ) as endDate
from tbl_temp t

通常情况下,我会建议coalesce()超过isnull()。但是,某些版本的SQL Server中存在一个错误,它会在第二个参数中评估第一个参数。通常情况下,这没有什么区别,但是它有一个子查询。

最后,使用sysdate让我想起了Oracle。同样的方法也适用于那里。

答案 1 :(得分:1)

;WITH x AS
(
    SELECT AID, UID, StartDate, 
        ROW_NUMBER() OVER(PARTITION BY AID, UID ORDER BY StartDate) AS rn
    FROM tbl_temp
)
SELECT x1.AID, x1.UID, x1.StartDate, 
    COALESCE(DATEADD(day,-1,x2.StartDate), CAST(getdate() AS date)) AS EndDate
FROM x x1
LEFT OUTER JOIN x x2 ON x2.AID = x1.AID AND x2.UID = x1.UID
    AND x2.rn = x1.rn + 1
ORDER BY x1.AID, x1.UID, x1.StartDate

SQL Fiddle example