2012-12-06 74 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