DB2:SQL:SCD 类型 2 的粒度更改 table

DB2 : SQL: Change in granularity for SCD type-2 table

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

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

接下来我有一行 table,它也在下面的类型 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 粒度从订单级别更改为订单项级别,并且在重新设计的订单项中 table 需要正确捕获订单项级别更改 + 交货日期的历史记录改变如下

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 

这是否可以通过使用现有订单和订单项 table 的 SQL 语句简单地实现?

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

这可能是适合您的解决方案:

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) 

有一篇关于该主题的精彩博客:Jon Maenpaa 的“Fun with Date Ranges

您还可以通过 Db2 Temporal Tables 提供时间旅行 SQL 来做到这一点。