2017-07-03 63 views
1

私はNULL値を持つ時系列を持っています。私は各ヌル値を直近の非値でない値に置き換えたいと思います。私が調査したところから、Oracle SQLでは、Last_valueとIGNORE NULLSを使用してこれを簡単に実行できます。 SQL Server 2016を使用して同様の方法でこれを実行できますか?それ以外の場合は、C#を使用してコードを作成するだけですが、SQLを使用するとより速く、よりクリーンで簡単になります。SQL ServerのIGNORE NULLSのLast_value

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

[Null値の以前の値を取得する方法](https://stackoverflow.com/questions/16669620/how-to-get-previous-value-for-null-values) –

答えて

2

あなたは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

Genius!私が必要とするものを正確に行います。しかし、私はこれを頻繁に、何百万行も行う予定です。 3百万レコードで上記を行うには約1分かかりました。 Oracle Expressに切り替えて、last_valueとIGNORE NULLSを使用すると、速度のメリットはありますか? –

+0

@TrevorD。 。 。あなたはそれを自分でテストしなければならないでしょう。もちろん、2つのウィンドウ関数を実行するよりも時間がかかります。私はその利益のためにデータベースを切り替える努力をする価値があるかどうかはわかりません。 –