【问题标题】:Overlaping dates重叠日期
【发布时间】:2019-04-19 13:16:44
【问题描述】:

*编辑 - 没有更新权限。

我有下表: id 应该只与一个区域相关联。 TableB 上有重叠。因此,19 年 1 月 9 日的约翰与东部和中东地区相关联。

我可以操纵 TableB 来修复重叠吗?

所以,最旧的行enddate (1/9/19) would change to 1/7/19.

可能有超过一天的重叠。

Lead 和或Lag 在这里使用?不知道从哪里开始。

表A

CustDate   id   Name
1/9/19      1   John

表B

StartDate   EndDate      AREA
 1/1/2019    1/9/19      East
 1/8/2019    12/31/4000  Mideast

示例 SQL

 ,CASE WHEN ENDDATE >
LEAD(STARTDATE) OVER (PARTITION BY ID ORDER BY STARTDATE) 
THEN MIN(ENDDATE) OVER (PARTITION BY ID) - interval '1' day
ELSE ENDATE
END END_DT2

【问题讨论】:

  • TableA 和这个问题有什么关系?
  • 正确。一个人可以在不参考表 A 的情况下回答这个问题,但添加它以直观地显示我的 Name 与多个区域相关联的问题..
  • 除了StartDate, EndDate, AREA 之外,难道没有像id 这样的列指代John 在tableb 中的id 吗?

标签: sql oracle lag lead


【解决方案1】:

您可以通过更新enddate 来修复TableB

update tableb b
    set enddate = (select min(startdate) - interval '1' day
                   from tableb b2
                   where b2.startdate > b.startdate
                  );

或者,将其表达为select

select b.startdate,
       lead(b.startdate, 1, date '4000-12-31') over (order by b.startdate) - interval '1' day as enddate,
       b.area
from tableb b;

【讨论】:

    【解决方案2】:

    也许是LeadLag

    如下所示:

      ,CASE
       WHEN ENDDATE > LEAD(STARTDATE) OVER (PARTITION BY ID ORDER BY STARTDATE) 
       THEN LEAD (STARTDATE) OVER (PARTITION BY ID ORDER BY STARTDATE) -1
                   ELSE ENDDATE
                   END END_DT
    

    【讨论】:

    • 如果这不是您问题的答案,请编辑您的问题并将代码放入其中,然后删除此帖子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多