首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DB2 : SQL: SCD type-2表的粒度更改

DB2 : SQL: SCD type-2表的粒度更改
EN

Stack Overflow用户
提问于 2020-11-01 09:12:40
回答 1查看 81关注 0票数 1

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

代码语言:javascript
复制
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行中(当数量变化或描述变化时,它具有历史记录)

代码语言:javascript
复制
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粒度更改以及在重新设计的行项目表中,需要正确捕获行项目级更改+交付日期更改的历史记录,如下所示

代码语言:javascript
复制
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数据库中尝试这个。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-01 23:29:28

这可能是您的一个解决方案:

代码语言:javascript
复制
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来做到这一点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64627856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档