2017-02-11 4 views
0

行の別の値に基づいて列の最大値を取得しようとしています。キーワード「グループ」付近に不適切な構文:私は次のエラーを取得する行の値に基づく列のsql max。

UPDATE LeweringVsSkattingResultaat 
    SET maks = ((SELECT max(persentklaarkultivar2) FROM 
    LeweringVsSkattingResultaat) 
    group by kultivar2) 

は、私は、次のコードを持っています。

kultivar2の各値に対して、persentklaarkultivar2列のmaksimum値が必要です。

ご協力いただければ幸いです。

よろしく

答えて

1

あなたがkultivar2の値よりも多くを持っている場合は、エラーが生成されますあなたのサブクエリ。 group byは、それぞれkultivar2の行を返します。

あなたが問題を解決するために相関サブクエリを使用できますが(答えの末尾を参照)、私は更新可能のCTEとウィンドウ関数でこれを行うのが好き:

with toupdate as (
     select r.*, 
      max(persentklaarkultivar2) over (partition by kultivar2) as maxval 
     from LeweringVsSkattingResultaat r 
    ) 
update toupdate 
    set maks = maxval; 

私は窓関数であることに注意する必要があり、あなたはあなたが望むときはいつでも最大値を簡単に計算できるので、それを保存する必要はありません。ウィンドウ関数はLeweringVsSkattingResultaat(kultivar2, persentklaarkultivar2)のインデックスを利用できるように最適化されています。

これはおそらくより良いアプローチです。テーブルから行が挿入、更新、または削除されたときに、maksの値を最新の状態に保つ方法を把握する必要はありません。

相関副問合せは次のようになります()

UPDATE LeweringVsSkattingResultaat 
    SET maks = (SELECT max(persentklaarkultivar2) FROM 
    LeweringVsSkattingResultaat 
    group by kultivar2) 

を削除

UPDATE r 
    SET maks = (SELECT max(r2.persentklaarkultivar2) 
       FROM LeweringVsSkattingResultaat r2 
       WHERE r2.kultivar2 = r.kultivar2 
       ) 
    FROM LeweringVsSkattingResultaat r; 
+0

内側の選択であるあなたにゴードンをありがとうございます。それは私のために働いた。 – Gideon

0

そうすることによって、あなたのグループが出て

関連する問題