插入历史行并相应地更改任一侧的行
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 的回复,我将开始对此进行试验并让您知道我的进展情况。再次感谢以上是关于插入历史行并相应地更改任一侧的行的主要内容,如果未能解决你的问题,请参考以下文章