0

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

-- tbl_temp

援助 UID 开始日期
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 开始日期 结束日期
1 1 2013-02-20 2013-02-20
1 1 2013-02-21 2013-02-26
1 1 2013-02-27 系统日期
1 2 2013-02-02 2013-02-03
1 2 2013-02-04 系统日期
2 1 2013-02-06 系统日期
4

2 回答 2

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()over isnull()。但是,在某些版本的 SQL Server 中存在一个错误,它对第一个参数求值两次。通常,这并没有什么区别,但是对于子查询却可以。

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

于 2013-03-01T03:39:11.127 回答
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 小提琴示例

于 2013-03-01T03:42:47.547 回答