1

我有一个 SCD 类型 2 的订单表,如下所示(订单粒度中的交货日期,它在交货日期更改时创建历史记录)

Order_Id Order_Status Order_Create_Dt Delivery_Dt Start_Date End_Date
O1       Open         20200303        20200321    20203001   20200306
O1       Open         20200303        20200320    20200307   20200311
O1       Open         20200303        20200318    20200312   99991231

接下来我有一个行表,它也在下面的 type-2 行中(当数量更改或描述更改时,它有历史记录)

Order_Id Line_Item_Id Line_Item_Desc Quantity Start_Date End_Date
O1       L1           ABC            1        20200303   20200304
O1       L1           ABC            4        20200305   99991231
O1       L2           DEF            2        20200303   99991231
O1       L3           XYZ            3        20200303   99991231

现在,作为设计更改的一部分,Delivery_Dt 粒度从订单级别更改为订单项级别,并且在重新设计的订单项表历史记录中需要正确捕获订单项级别更改 + 交货日期更改,如下所示

Order_Id Line_Item_Id Line_Item_Desc Quantity Delivery_Dt Start_Date End_Date
O1       L1           ABC            1        20200321    20200303   20200304
O1       L1           ABC            4        20200321    20200305   20200306
O1       L2           DEF            2        20200321    20200303   20200306
O1       L3           XYZ            3        20200321    20200303   20200306  
O1       L1           ABC            4        20200320    20200307   20200311
O1       L2           DEF            2        20200320    20200307   20200311
O1       L3           XYZ            3        20200320    20200307   20200311  
O1       L1           ABC            4        20200318    20200312   99991231
O1       L2           DEF            2        20200318    20200312   99991231
O1       L3           XYZ            3        20200318    20200312   99991231 

这可以简单地通过使用现有订单和行项目表的 SQL 语句来实现吗?

我正在 DB2 数据库中尝试这个。

4

1 回答 1

0

这可能是您的解决方案:

SELECT t1.Order_Id, t2.Line_Item_Id, t2.Line_Item_Desc, t2.Quantity, t1.Delivery_Dt
     , max(t1.Start_Date, t2.Start_Date) AS Start_Date
     , min(t1.End_Date, t2.End_Date) AS End_Date
  FROM t2 
 INNER JOIN T1 
    ON t2.Order_Id = t1.Order_Id
       AND t1.Start_Date <= t2.End_Date 
       AND t1.End_Date >= t2.Start_Date 
 WHERE max(t1.Start_Date, t2.Start_Date) <> min(t1.End_Date, t2.End_Date) 

有一篇关于该主题的精彩博客:„<a href="https://www.idug.org/browse/blogs/blogviewer?BlogKey=0539cb01-a914-47fe-a127-3313bd12239e" rel="nofollow noreferrer">日期范围的乐趣“由 Jon Maenpaa

您还可以使用另外提供时间旅行 SQL 的Db2 临时表来做到这一点。

于 2020-11-01T15:29:27.690 回答