【问题标题】:Avoid overlapping in by adding a day in BI_StartDate通过在 BI_StartDate 中添加一天来避免重叠
【发布时间】:2020-03-12 10:13:05
【问题描述】:

我有以下员工版本控制表:

EmployeeId ManagerId DepartmentId StartDate   EndDate
--------------------------------------------------------
45         2         56           2017-06-27  2018-02-07
45         3         98           2018-02-07  2018-08-25
45         3         55           2018-02-25  2018-08-25
45         6         44           2018-08-25  9999-12-31

我想更正 StartDate 如下以避免重叠:

EmployeeId ManagerId DepartmentId StartDate   EndDate
---------------------------------------------------------
45         2         56           2017-06-27  2018-02-07
45         3         98           2018-02-08  2018-08-25
45         3         55           2018-02-26  2018-08-26
45         6         44           2018-08-27  9999-12-31

第一条记录EndDate = 2018-02-07的逻辑如下所示,下一条记录将有EndDate + 1 day = 2018-02-08。对于EndDate = StartDate 的记录,它将在上一个 EndDate + 1 中都有。

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    假设你的数据不是很离谱,你可以使用lag():

    with toupdate as (
          select t.*,
                 lag(enddate) over (partition by employee order by startdate) as prev_enddate
          from t
         ) t
    update toupdate
        set startdate = dateadd(day, 1, prev_enddate)
        where startdate <> dateadd(day, 1, prev_enddate);
    

    如果您的数据有很多非常复杂的重叠,那么这会有点棘手。基本上,您希望保留结束日期并使用它们来计算开始日期——除了第一行之外的所有日期:

    with toupdate as (
          select t.*,
                 lag(enddate) over (partition by employee order by enddate) as prev_enddate,
                 row_number() over (partition by employee order by startdate) as seqnum
          from t
         ) t
    update toupdate
        set startdate = dateadd(day, 1, prev_enddate)
        where seqnum <> 1 and
              startdate <> dateadd(day, 1, prev_enddate);
    

    你需要seqnum(或类似的东西),因为在这种情况下你不能保证最早的开始日期有最早的结束日期。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-22
      • 2014-02-19
      • 2018-02-12
      • 2016-11-22
      • 2018-06-07
      • 2019-12-21
      • 2022-11-11
      相关资源
      最近更新 更多