【问题标题】:SQL - Update Record Based on Entity's Previous RecordSQL - 根据实体的先前记录更新记录
【发布时间】:2018-07-28 06:33:48
【问题描述】:

我有一个包含 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

【问题讨论】:

    标签: sql sql-server tsql cursor common-table-expression


    【解决方案1】:
    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 
    

    【讨论】:

      【解决方案2】:

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

      您可以使用可更新的 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;
      

      【讨论】:

      • 是的,我必须知道结束日期。谢谢!我会尝试一下。我倾向于 CTE,但不知道如何实现。
      猜你喜欢
      • 1970-01-01
      • 2021-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-12
      • 1970-01-01
      相关资源
      最近更新 更多