2012-12-06 30 views
1

电流输出TSQL - 从下一相邻行

Activity   FromTime    ToTime 
------------------------------------------------------------------- 
STOPPED INSIDE POI 2012-11-14 01:08:46.000 2012-11-14 01:19:46.000 
MOVING INSIDE POI 2012-11-14 01:20:46.000 2012-11-14 01:21:46.000 
MOVING OUTSIDE POI 2012-11-14 01:22:46.000 2012-11-14 01:22:46.000 
STOPPED OUTSIDE POI 2012-11-14 01:23:46.000 2012-11-14 01:23:46.000 
MOVING OUTSIDE POI 2012-11-14 01:24:46.000 2012-11-14 01:25:46.000 

期望输出

Activity   FromTime    ToTime 
------------------------------------------------------------------- 
STOPPED INSIDE POI 2012-11-14 01:08:46.000 2012-11-14 01:20:46.000 
MOVING INSIDE POI 2012-11-14 01:20:46.000 2012-11-14 01:22:46.000 
MOVING OUTSIDE POI 2012-11-14 01:22:46.000 2012-11-14 01:23:46.000 
STOPPED OUTSIDE POI 2012-11-14 01:23:46.000 2012-11-14 01:24:46.000 
MOVING OUTSIDE POI 2012-11-14 01:24:46.000 2012-11-14 01:25:46.000 

这样做的任何简单的方法来填充记录?

+0

你能否提供表名和列名?有没有在这里使用的主键或其他排序顺序? – PinnyM

+0

太棒了! –

+0

添加了列名标题@ PinnyM – Learner

回答

1

这应该为你工作:

UPDATE table1 
SET ToTime = join_table.newToTime 
FROM (
    SELECT t2.FromTime target, MIN(t1.FromTime) newToTime 
    FROM table1 t1 
    JOIN table1 t2 ON t1.FromTime > t2.FromTime 
    GROUP BY t2.FromTime) join_table 
WHERE FromTime = join_table.target 

基本上你正在寻找的最低FromTime比当前行更大 - 和使用,作为为ToTime新的价值。请注意,最后一行不会更新,因为找不到匹配的更大的FromTime

+0

超级@ Pinny这就是我正在试图做的选择。但在选择之前更新临时表让我的生活变得更轻松。谢谢! – Learner

+0

如果有两个相同的FromNights(当然没有提到会发生这种情况),此版本将返回错误的结果,因为它们对于它们都具有相同的ToTime,这将是所有相同之后的第一个不同时间。在这种情况下,T-Clausen的版本将获得正确的结果!所以,我认为t-clausens版本是正确的答案。 –

+0

在这种情况下,并不清楚这些会是'错误的结果' - 它取决于ToTime列的预期用法。由于没有为重复的FromTime条目定义排序顺序,有人可能会认为t-clausen的结果在这种情况下是不可预测的。提供的解决方案基于所需的上下文,而不是在这种情况下无意义的抽象可能性。 – PinnyM

1
;with a as 
(
select Activity, FromTime, ToTime, 
row_number() over (order by FromTime) rn from <yourtable> 
) 
select a.Activity, a.FromTime, coalesce(b.FromTime, a.ToTime) ToTime 
from a left join a b on a.rn = b.rn - 1 
order by a.rn 
+0

介意添加一条简短评论? – Christoph

+0

谢谢@ t-clausen,我明白了,但在这一点上,我有点更多的工作要走这条路,现在时间不够了。但是,我会很快尝试这个解决方案,并让每个人都知道。再次感谢你的帮助。 – Learner