2016-04-12 3 views
2

Ich habe einen CASE-Ausdruck in einer SQL-Abfrage. Ich möchte eine neue Spalte als Rang basierend auf dem Case-Ausdruck erstellen und nur die Zeile aktualisieren, die das maximale Datum für die Anmeldung hat.So aktualisieren Sie eine Zeile basierend auf einer Bedingung aus einer Groß-/Kleinschreibung

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 

Wie kann ich eine Bedingung zu dem obigen Code nur hinzufügen, um die Spalte zu aktualisieren, die 1 und aktuelles Login Datum innerhalb der gleichen Anmeldung zu anderen Zeilen verglichen zählen hat?

End Tabelle sollte wie folgt aussehen:

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 

Antwort

6

Ich glaube, Sie suchen 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

, wie mehrere hinzuzufügen, wenn und dann oben Zustand? Danke für diese – rookie

+0

Und Problem mit diesem Code ist es nur die letzte Anmeldung von den gesamten Zeilen als Rang 1 aktualisiert und den Rest ignorieren. Ich möchte den Rang auf regID-Basen aktualisieren. Für Reg-ID 221 wird es einen Rang 1 geben und ähnlich wird für 366 ein anderer Rang 1 da sein. Der obige Code sieht nicht so aus. Bitte helfen Sie – rookie

+0

@rookie. . . Diese Spalte gehört zur 'Partition von'. Ich dachte, die einzige Spalte, die für das Aufteilen der Daten interessant ist, war "count". –

Verwandte Themen