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

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

我有两张桌子

  1. 价格调整
  2. 转换系数调整

为了计算给定的价格,在统一的 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 

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

【问题讨论】:

    标签: sql sql-server pivot


    【解决方案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 )
      猜你喜欢
      • 2018-02-03
      • 1970-01-01
      • 1970-01-01
      • 2019-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-06
      • 2020-10-20
      相关资源
      最近更新 更多