我有一个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接下来,我有一个线表,它也在下面的类型-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 是否只需使用现有的Order和Line Item表通过SQL语句即可实现此目的?
我正在DB2数据库中尝试这个。
发布于 2020-11-01 23:29:28
这可能是您的一个解决方案:
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”
你也可以用另外提供时间旅行SQL的Db2 Temporal Tables来做到这一点。
https://stackoverflow.com/questions/64627856
复制相似问题