根据变更日志创建从/到日期列

Posted

技术标签:

【中文标题】根据变更日志创建从/到日期列【英文标题】:Create From/To date columns based on changelog 【发布时间】:2020-10-23 08:38:15 【问题描述】:

简要回顾一下我目前的情况: 我希望合并两个单独的日志文件,以便在另一个日志时获取一个日志的值。

我有两张桌子

    价格调整 转换系数调整

为了计算给定的价格,在统一的 UOM(计量单位)中,我们使用转换因子作为乘数

所以例如 1box (转换系数) * 200 (价格) = 100pcs (转换系数) * 2(价格)

我们数据中的价格和转换系数字段都有类似这样的日志

     Date      Part_No   Supplier_Id   Old_Value   New_Value  
 ------------ --------- ------------- ----------- ----------- 
  11-09-2019   A         B                     1           5  
  19-09-2019   A         B                     5           1

名为 LOG_ID 的列是唯一整数,因为可以在同一天进行多项更改

我希望将表格转换为可以使用起始/截止日期连接在一起的表格

所以我想要的输出如下所示(请注意,第一行有一个静态的 From_Date,最后一行的 currentdate 为 To_Date

  Part_No   Supplier_Id   From_Date     To_Date     Value  
 --------- ------------- ------------ ------------ ------- 
  A         B             01-03-2010   10-09-2019       1  
  A         B             11-09-2019   18-09-2019       5  
  A         B             19-09-2019   23-10-2020       1 

我认为需要将数据透视函数与循环相结合,但我无法完全弄清楚如何将两者结合起来以识别今天之前所做的更改,一直到结束日期。

【问题讨论】:

【参考方案1】:

根据之前对这个问题的回答,我已经走了这么远

SELECT
    Part_No,
    Supplier_Id,
    Date AS From_Date,
    ISNULL(DATEADD(dd,-1,lead(Date) OVER (PARTITION BY Part_No, Supplier_Id ORDER BY Date)),Date) AS To_date,
    New_Value

FROM
    data_Table

这会产生以下输出

    Part_No     Supplier_Id   From_Date     To_date     New_Value  
 ------------- ------------- ------------ ------------ ----------- 
  1032515-001          5277   11-09-2019   18-09-2019           5  
  1032515-001          5277   19-09-2019   19-09-2019           1 

不幸的是,这并不是我想要的,正如我原来的问题中所解释的那样。下表显示了我想要的输出:

  Part_No   Supplier_Id   From_Date     To_Date     Value  
 --------- ------------- ------------ ------------ ------- 
  A         B             01-03-2010   10-09-2019       1  
  A         B             11-09-2019   18-09-2019       5  
  A         B             19-09-2019   23-10-2020       1 

静态的第一个 from_date,当前日期为动态的最终 to_date

【讨论】:

【参考方案2】:

您需要利用 UNPIVOT 和 LEAD 函数来实现:

DECLARE @table table(dateval date,partno char(1), supplierid char(1),
old_value int, new_value int)

insert into @table 
values
  ('2019-09-11','A','B',1,5),  
  ('2019-09-19','A','B',5,1);

select partno, supplierid, dateval as From_Date, 
isnull(dateadd(dd,-1,lead(dateval) over  (partition by partno, supplierid order by dateval)),dateval) as To_date, val
from @table
unpivot 
(
val
for keyv in ([old_value],[new_value])
) as upvt
where keyv = 'old_value'

+--------+------------+------------+------------+-----+
| partno | supplierid | From_Date  |  To_date   | val |
+--------+------------+------------+------------+-----+
| A      | B          | 2019-09-11 | 2019-09-18 |   1 |
| A      | B          | 2019-09-19 | 2019-09-19 |   5 |
+--------+------------+------------+------------+-----+

【讨论】:

不幸的是,这不是我想要的 @HenrikPoulsen,2019-10-23 是如何出现的?我们在测试数据中没有那个值 正如我原来的帖子中提到的,最后一行应该总是从日志文件中的最后一个条目开始,直到当前日期(在我原来的帖子时,这是 2019-10-23 )

以上是关于根据变更日志创建从/到日期列的主要内容,如果未能解决你的问题,请参考以下文章

如何将变更日志添加到使用 CPack 创建的 RPM

为语义发布的包生成变更日志

Elasticsearch7.8.0版本进阶——持久化变更

如何为变更日志表指定架构位置

Maven 自动生成版本控制和变更日志

redo log buffer刷写变更日志到redo log的策略