Sql 更新前一行的开始和结束日期
这个例子比仅仅根据新记录的开始日期更新以前的记录要复杂一些。我希望你能帮忙 ID1000(有很多ID,我们需要分区?)有一个初始开始日期 该ID将链接到另一个合同。因此,第一份合同的结束日期是第二份合同的开始日期。请注意,第二份合同可能是也可能不是未来日期 但是,在第二个合同开始之前,ID可能会链接到不同的合同。因此,第二份合同无效。第三份合同现在优先,第一份合同的结束日期需要更改为第三份合同的开始日期。第二份合同显示的开始和结束日期相同 关于如何使用T-SQL实现这一点,有什么想法吗Sql 更新前一行的开始和结束日期,sql,loops,tsql,stored-procedures,Sql,Loops,Tsql,Stored Procedures,这个例子比仅仅根据新记录的开始日期更新以前的记录要复杂一些。我希望你能帮忙 ID1000(有很多ID,我们需要分区?)有一个初始开始日期 该ID将链接到另一个合同。因此,第一份合同的结束日期是第二份合同的开始日期。请注意,第二份合同可能是也可能不是未来日期 但是,在第二个合同开始之前,ID可能会链接到不同的合同。因此,第二份合同无效。第三份合同现在优先,第一份合同的结束日期需要更改为第三份合同的开始日期。第二份合同显示的开始和结束日期相同 关于如何使用T-SQL实现这一点,有什么想法吗 id
id contract Start Date End Date
1000 1 2017/08/31 9999/12/31
id contract Start Date End Date
1000 1 2017/08/31 2017/09/16
1000 2 2017/09/16 9999/12/31
id contract Start Date End Date
1000 1 2017/08/31 2017/09/14
1000 2 2017/09/16 2017/09/16
1000 3 2017/09/14 9999/12/31
先谢谢你
问候
D这适用于样本数据,但如果一行中可能有多个合同无效,则此操作将失败
declare @table table (id int, contract int, StartDate date, EndDate date)
insert into @table
values
(1000,1,'20170831',NULL),
(1000,2,'20170916',NULL),
(1000,3,'20170914',NULL)
;with cte as(
select
id
,contract
,StartDate
,EndDate
,NewEndDate = case when StartDate > lead(StartDate) over (partition by id order by contract) then StartDate else lead(StartDate) over (partition by id order by contract) end
from @table t),
cte2 as(
select
id
,contract
,StartDate
,EndDate
,NewEndDate = case when NewEndDate = Lead(NewEndDate) over (partition by id order by contract) then Lead(StartDate,2) over (partition by id order by contract) else NewEndDate end
from
cte
)
update cte2
set EndDate = NewEndDate
select * from @table
一行编辑99个空值
declare @table table (id int, contract int, StartDate date, EndDate date)
insert into @table
values
(1000,1,'20170831',NULL),
(1000,2,'20170916',NULL),
(1000,2,'20170915',NULL),
(1000,3,'20170914',NULL)
;with cte as(
select
id
,contract
,StartDate
,EndDate
,NewEndDate =min(StartDate) over (partition by id order by contract ROWS BETWEEN 1 FOLLOWING AND 99 FOLLOWING )
from
@table),
cte2 as(
select
id
,contract
,StartDate
,EndDate
,NewEndDate = isnull(case when NewEndDate = lag(NewEndDate) over (partition by id order by contract) then StartDate else NewEndDate end,'99991231')
from
cte)
update cte2
set EndDate = NewEndDate
select * from @table
什么版本的SQL Server?嗨,西蒙,这是SQL 2014。谢谢:)可以有多个无效的合同。因此,您甚至可以有2或3行(例如)变为无效。正如你提到的,铅会失效。那么,你能提供更好的样品数据吗?为什么不添加一个列作为无效/活动标志?这种情况很常见。示例中的逻辑是预期的,但您可能会发现2017/09/16是无效的3倍。我没有其他样本数据。我只是很快地编造了这个,因为这就是我面临的情况。如果你添加了一个标志,你会怎么做?我愿意接受建议。到目前为止非常感谢,非常感谢。我添加了一个编辑,一行最多可以解释99个空和空。