2017-09-01 7 views
0

フィールドがあるテーブルがあります: enter image description here この値 - 1023とQualityCode - 53はランダムな時間に発生する可能性がありますすべてのMeterNumには約24個の値があり、ROW_IDは24まで増分してから新しいMeterNumに対して1から始まり、少なくとも別のエイリアス列を追加しない場合は、平均を46と21(row_num 19 & 21)に置き換える必要があります。 selectステートメント私はケースステートメントを思いついてみようとしていましたが、私は値を平均化することができません、誰かがこれを助けることができます。SQLのcase文を使用して条件を満たすレコードの連続する値を平均する方法

+4

素敵なテキスト表に戻ってください。答えを出すためにテストするためにデータを複製する必要がある人は、テーブルの写真は無用です。各行に4つのスペースを入れてテキストテーブルをインデントしてください。最後に編集する前に私の編集を参照してください。 – JNevill

答えて

3

あなたはCASE文の内部のロジックのこの種を行うにLagLeadを使用することができます。

UPDATE TABLE 
SET VALUE = CASE 
     WHEN VALUE = 1023 
      THEN (
        Lag(Value, 1) OVER (PARTITION BY meternum ORDER BY row_id ASC) 
        + Lead(Value, 1) OVER (PARTITION BY meternum ORDER BY row_id ASC) 
       )/2 
     ELSE VALUE 
     END 

ラグとリードはウィンドウ関数です。ラグは、指定されたレコード数(ここでは1に戻ります)を返し、値を取得します。これは、PARTITION BY句(ここでは、同じMeterNumを持つレコードのみを戻す)でどのレコードを決定し、ORDER BY句でレコードの順序を決定します(ここでは、row_idによって順序付けされます)。

+0

ありがとう、これは完全に動作します。しかし、1つの問題はありますが、値= 1023が2つ以上の間隔で一貫している場合、最初と最後の関連する値を取って平均をとり、それらの複数の1023の値に対して適用します。 例:値は24,1023です、1023,1023,32の場合、私は24と32の平均をとって、3つの1023の値すべてにその値を適用することになっています。 あなたはそれについて何か提案してもらえますか? @JNevill – user1960217

関連する問題