我正在尝试处理包含历史产品信息的表格。有时我会收到我需要插入的历史更新。但是我不确定如何相应地改变行的日期。我已经研究了滞后和领先但我真的很挣扎。是否有人能够给我一些指示从哪里开始,不一定是解决方案。 如果能够提供更简单的解决方案,我确实可以选择更改表格结构。非常感谢
表格中的初始数据:
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)]);
答案 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);
当然,您可以将此限制为您要更改的特定产品/版本。
如果您正在影响大量行或进行批量插入,则建议使用此方法(默认情况下,批量插入不会触发触发器)。