Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 更新前一行的开始和结束日期_Sql_Loops_Tsql_Stored Procedures - Fatal编程技术网

Sql 更新前一行的开始和结束日期

Sql 更新前一行的开始和结束日期,sql,loops,tsql,stored-procedures,Sql,Loops,Tsql,Stored Procedures,这个例子比仅仅根据新记录的开始日期更新以前的记录要复杂一些。我希望你能帮忙 ID1000(有很多ID,我们需要分区?)有一个初始开始日期 该ID将链接到另一个合同。因此,第一份合同的结束日期是第二份合同的开始日期。请注意,第二份合同可能是也可能不是未来日期 但是,在第二个合同开始之前,ID可能会链接到不同的合同。因此,第二份合同无效。第三份合同现在优先,第一份合同的结束日期需要更改为第三份合同的开始日期。第二份合同显示的开始和结束日期相同 关于如何使用T-SQL实现这一点,有什么想法吗 id

这个例子比仅仅根据新记录的开始日期更新以前的记录要复杂一些。我希望你能帮忙

ID1000(有很多ID,我们需要分区?)有一个初始开始日期

该ID将链接到另一个合同。因此,第一份合同的结束日期是第二份合同的开始日期。请注意,第二份合同可能是也可能不是未来日期

但是,在第二个合同开始之前,ID可能会链接到不同的合同。因此,第二份合同无效。第三份合同现在优先,第一份合同的结束日期需要更改为第三份合同的开始日期。第二份合同显示的开始和结束日期相同

关于如何使用T-SQL实现这一点,有什么想法吗

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个空和空。