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