2016-04-12 18 views
2

SQLクエリにCASE式があります。私はケース式に基づいてランクとして新しい列を作成し、ログインの最大日付を持つ行のみを更新したいと思います。ケース式の条件に基づいて行を更新する方法

select A.*, 
    CASE   
    WHEN A.COUNT = 1   
    THEN 'rank1' 
    -- I want to give the condition here saying update the row 
    -- which has the latest login date with 'rank1' .. now it is 
    -- updating all the row which has count as 1 
    else 'rank2' end as Rank 
from table A 

上記のコードに条件を追加して、同じ登録内の他の行と比較してカウント1と最新のログイン日を持つ列のみを更新するにはどうすればよいですか?

エンドテーブルは次のようになります。

count regID login  rank 
1  221  10 april 16  rank1 
1  221  9 april 16  rank2 
1  221  8 april 16  rank2 
1  366  8 march 16  rank2 
1  366  1 feb 16  rank2 
1  366  22 april 16  rank1 

答えて

6

を、私はあなたがrow_number()を探していると思う:

select A.*, 
     (case when a.count = 1 and 
        row_number() over (partition by a.count, regid order by login desc) = 1 
      then 'rank1' 
      else 'rank2' 
     end) as rank 
from table A; 
+0

方法を複数追加するとき、その後、上記の条件?これはありがとうございます – rookie

+0

このコードの問題は、行全体から最新の最後のログインをランク1として更新し、残りを無視することだけです。私はregIDベースのランクを更新したい。 reg ID 221には1つのランク1があり、同様に366には別のランク1があります。上記のコードはこのようには見えません。助けてください – rookie

+0

@ルーキー。 。 。その列は 'by by by partition 'に入ります。私は、データを分割するための興味のある唯一の列は 'カウント 'だと考えました。 –

関連する問題