我正在使用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
答案 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