插入历史行并相应地改变行的两侧

时间:2018-03-07 14:49:09

标签: sql sql-server tsql

我正在尝试处理包含历史产品信息的表格。有时我会收到我需要插入的历史更新。但是我不确定如何相应地改变行的日期。我已经研究了滞后和领先但我真的很挣扎。是否有人能够给我一些指示从哪里开始,不一定是解决方案。 如果能够提供更简单的解决方案,我确实可以选择更改表格结构。非常感谢

表格中的初始数据:

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

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

self.xMap = function (d) {
    return self.xScale(self.xValue(d));
}
self.xValue = function (d) {
    return d.x;
}
self.xScale = d3.scale.linear().range([0, width]);
self.xAxis = d3.svg.axis().scale(self.xScale).orient("bottom");

self.yMap = function (d) {
    return self.yScale(self.yValue(d));
}
self.yValue = function (d) {
    return d.y;
}

self.yScale = d3.scale.linear().range([height, 0])
self.yAxis = d3.svg.axis().scale(self.yScale).orient("left");

var svg = d3.select("div.canvas_wrapper").append("svg")
    .attr("width", width + margin.left + margin.right)
    .attr("height", height + margin.top + margin.bottom)
    .append("g")
    .attr("transform", "translate(" + margin.left + "," + margin.top + ")");

var xExtent = d3.extent(flattenedData, function (d) { return +d.x; }),
    xRange = xExtent[1] - xExtent[0];

self.xScale.domain(xValues);

var min = d3.min(flattenedData, function (ld) { return +ld.y });

/* Code that I have taken out
if (min > 0) {
    min = 0;
}*/

var yMax = d3.max(flattenedData, function (d) { return +d.y; })

var yRange = yMax - min;

self.yScale.domain([min - (yRange * .05), yMax + (yRange * .05)]);

1 个答案:

答案 0 :(得分:2)

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

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);

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

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