2017-07-03 27 views
1

我有一個空值的時間系列。我想用最近的非非值來替換每個空值。從我研究的內容來看,Oracle SQL可以使用IGNORE NULLS使用Last_value輕鬆完成此任務。有沒有類似的方法來使用SQL Server 2016來完成這項工作?否則,我只是使用C#編寫代碼,但感覺使用SQL會更快,更乾淨,更容易。Last_value與IGNORE NULLS在SQL Server中

Sec SCORE 
1 Null 
2 Null 
3 5 
4 Null 
5 8 
6 7 
7 Null 

應改爲:

Sec SCORE 
1 Null 
2 Null 
3 5 
4 5 
5 8 
6 7 
7 7 
+1

可能重複[如何獲得空值的以前的值](https://stackoverflow.com/questions/16669620/how-to-get-previous-value-for-null-values) –

回答

2

你可以用兩個累積操作做到這一點:

select t.*, 
     coalesce(score, max(score) over (partition by id)) as newscore 
from (select t.*, 
      max(case when score is not null then id end) over (order by id) as maxid 
     from t 
    ) t; 

最裏面的子查詢獲取最近的id其中有一個值。最外面的那個「擴展」該值到後續行。

如果您確實想要更新表格,可以將其輕鬆納入update。但是,Oracle不能那麼做(很容易),所以我猜這不是必須的。

+0

天才!正是我所需要的。不過,我打算經常這樣做,並且在數百萬行上。花費大約1分鐘時間在300萬條記錄上進行上述操作。如果我切換到Oracle Express並使用IGNORE NULLS使用last_value,我會獲得顯着的速度優勢嗎? –

+0

@TrevorD。 。 。你必須自己測試一下。當然,運行兩個窗口函數需要比運行一個更長的時間;我不確定是否值得爲獲得該收益而切換數據庫。 –