插入历史行并相应地更改任一侧的行

Posted

技术标签:

【中文标题】插入历史行并相应地更改任一侧的行【英文标题】:Insert a Historic Row and alter rows either side accordingly 【发布时间】:2018-03-07 14:49:08 【问题描述】:

我正在尝试处理包含历史产品信息的表格。有时我会收到需要插入的历史更新。但是,我不确定如何相应地更改两侧行的日期。我已经考虑过滞后和领先,但我真的很挣扎。谁能给我一些关于从哪里开始的指示,不一定是解决方案。 我确实可以选择更改表结构,如果这将使解决方案更容易。非常感谢

表中的初始数据:

PRODUCT         VERSION   START_DATE     END_DATE
Lamp_Fitting    2         01/01/18       11/01/18 
Lamp_Fitting    2         12/01/18       NULL
Lamp_Fitting    1         24/05/17       11/11/17
Lamp_Fitting    1         12/11/17       NULL

然后我收到一行,开始日期为 2018 年 1 月 8 日,这意味着我需要插入它,但还需要调整前一行的结束日期,并将结束日期应用于插入的行。 插入行后,表格应如下所示:

PRODUCT         VERSION   START_DATE     END_DATE
Lamp_Fitting    2         01/01/18       07/01/18 
Lamp_Fitting    2         08/01/18       11/01/18 
Lamp_Fitting    2         12/01/18       NULL
Lamp_Fitting    1         24/05/17       11/11/17 
Lamp_Fitting    1         12/11/17       NULL

【问题讨论】:

【参考方案1】:

您可以使用触发器来执行此操作。或者事后清理。清理代码如下:

with toupdate as (
      select t.*,
             lead(start_date) over (partition by product, version order by start_date) as next_start_date
      from t
     )
update toupdate
    set end_date = dateadd(day, -1, next_start_date)
    where end_date <> dateadd(day, -1, next_start_date);

当然,您可以将其限制为您正在更改的特定产品/版本。

如果您要影响大量行或进行批量插入,则建议使用此方法(默认情况下,批量插入不会触发触发器)。

【讨论】:

感谢 Gordon 的回复,我将开始对此进行试验并让您知道我的进展情况。再次感谢

以上是关于插入历史行并相应地更改任一侧的行的主要内容,如果未能解决你的问题,请参考以下文章

房间更新(如果不存在则插入)行并返回计数更改的行

仅插入唯一行并更新已存在的行

SQL Server:从一个表中复制新添加的行并自动插入到另一个表中

从一个表中选择行并插入到另一个表中

读取 txt 文件的行并组织在 JSON 文件中

如果基于开始日期的行之间没有更改,则合并员工历史记录