繁体   English   中英

SQL-基于实体的先前记录的更新记录

[英]SQL - Update Record Based on Entity's Previous Record

我有一个临时表,该表具有一个entityID,一个开始日期,一个结束日期和天数。 我通过获取开始日期和结束日期以及+1天之间的datediff来获得天数。 我遇到的问题是,当一个实体的第二条记录的开始日期与上一个结束日期相同时,我得到的天数太多了1。 即:

EntityID    StartDate    EndDate    NumOfDays
--------    ---------    -------    ---------
3414        02/01/2018   02/02/2018    2 
3414        02/02/2018   02/10/2018    9

我需要将第二条记录的StartDate设置为02/03/2018,并且NumOfDays变为8,以便整个天数范围是10,这是正确的。 临时表在EntityID StartDate上排序。 表中将有成千上万的记录,而在这种情况下可能有数百条记录。 如果该实体的上一个结束日期相同,则仅需要更改开始日期。

我应该循环吗? 光标? 或者,还有更好的方法?

我们正在使用SQL Server 2014

首先,似乎您应该在计算没有结束日期的天数。 这样可以解决问题。 但是,这可能行不通。

您可以使用可更新的CTE:

with toupdate as (
      select t.*, lag(end_date) over (partition by entityid order by start_date) as prev_end_date
      from t
     )
update toupdate
     set numofdays = numofdays - 1
     where prev_end_date = end_date;
Declare @t TABLE (EntityID  INT,   StartDate DATE,   EndDate DATE)
INSERT INTO @t VALUES
(3414  ,'02/01/2018','02/02/2018'), 
(3414  ,'02/02/2018','02/10/2018');

WITH x AS (
      SELECT t.*
            , CASE WHEN LAG(EndDate) OVER (PARTITION BY EntityID ORDER BY StartDate) >= StartDate
                   THEN DATEADD( DAY , 1 , LAG(EndDate) OVER (PARTITION BY EntityID ORDER BY StartDate))
              ELSE StartDate END NewStartDate
      FROM @t t
     )
SELECT EntityID 
    , NewStartDate 
    , EndDate 
    , DATEDIFF(DAY, NewStartDate , EndDate) + 1 AS NumOfDays 
FROM X 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM