2016-08-04 41 views
0

我想更新每个团队的第一行后面的所有行。我想更新每个团队的第一行后的所有行

表名:测试

ID , Team , StartTime, EndTime, TotalTime 
1....... A.........18:00.........20:00..........2:00 
2....... B.........18:00.........20:00..........2:00 
3........A.........18:00.........20:00..........2:00 
4........F.........18:00.........20:00..........2:00 
5........B.........18:00.........20:00..........2:00 

UPDATE TEST SET StartTime = DateAdd(SECOND, - ProjectedTime * 60, EndTime) 

所以在这里,我想更新的行3和行5(因为它们不是基于团队的第一条记录)

我如何实现这一目标?

+0

只是为了想的那样,已经给出的答案是好的,如果一个团队有3条记录,你想记录#2,#3被相同的时间间隔改变,或者第三次迭代与第二次相比有所改变? –

+0

是的。因此,在更改第3条记录时应使用第二条记录的结束日期时间。这是我仍然坚持的地方 – user3162979

+0

您正在使用哪个SqlServer版本?从SqlServer2012开始,您拥有为此而构建的Lead/Lag窗口函数。在此之前,您需要使用Row_Number()来枚举CTE中的记录,然后执行偏移连接。 –

回答

0

您可以使用CTE。

with cte as 
    (

    select test.*, row_number() over (partition by team order by ID) as teamRowNum 
    from TEST 
    ) 
    UPDATE cte SET StartDate = DateAdd(SECOND, - ProjectedTime * 60, EndDate) 
    where teamRowNum > 1 
0

您可以使用CTE与row_number()

with toupdate as (
     select t.*, row_number() over (partition by team order by id) as seqnum 
     from test 
    ) 
update toupdate 
    set StartDate = DateAdd(SECOND, - ProjectedTime * 60, EndDate) 
    where seqnum > 1; 
相关问题