2017-10-19 1 views
0

Ci-dessous un tableau:Mise en forme conditionnelle sur la valeur MAX ligne

Paration par ID & capture la ligne de MAX valeur lorsque rôle = rouge

ID Role  HistID Date  Style 
1  Yellow  101  1/1/17  M 
1  Red  101  1/2/17  F 
1  Red  (Null) 1/5/17  C 
2  Blue  101  5/1/17 a 
2  Yellow  201  4/1/17 b 
2  Red  301  5/5/17 C 
3  Yellow  (Null) 

Referece les lignes ci-dessous:

ID Role  HistID  Date  Style 
    1  Red  (Null)  1/5/17 c 
    2  Red  301  5/5/17 c 

Maintenant, en fonction de ces lignes, appliquez une condition.

WHEN HistID IS NOT NULL and Style = C THEN 'Assigned' 
    ELSE'Unassigned' 
END Status 

Sortie:

ID Role  HistID Date  Style Status 
1  Yellow  101  1/1/17  M   Unassigned 
1  Red  101  1/2/17  F   Unassigned 
1  Red  (Null) 1/5/17  C   Unassigned 
2  Blue  101  5/1/17 a   Assigned 
2  Yellow  201  4/1/17 b   Assigned 
2  Red  301  5/5/17 C   Assigned 
3  Yellow  (Null)      Unassigned 

Pas tellement la réponse ici, je voudrais comprendre et apprendre la syntaxe derrière l'application MAX, Case Expression et Keep clause.

Répondre

0

Utiliser les fonctions de fenêtre:

select t.*, 
     (case when matches_flag > 0 then 'Assigned' else 'Unassigned' end) as status 
from (select t.*, 
      sum(case when role = 'Red' and histid is not null and style = 'C' then 1 else 0 end) over 
       (partition by id) as matches_flag 
     from t 
    ) t; 

EDIT:

Le sous-requête est pas réellement nécessaire. Je pense juste que cela rend la logique plus facile à suivre. Vous pouvez faire:

select t.*, 
     (case when sum(case when role = 'Red' and histid is not null and style = 'C' then 1 else 0 end) over (partition by id) > 0 
      then 'Assigned' 
      else 'Unassigned' 
     end) as status 
from t; 
+0

pas sûr que donner la réponse que je demande. la sous-requête trouvera toute ligne correspondant à ce critère. Je suis à la recherche de la ligne MAX par ID, puis appliquer une condition. –

+0

@JoJo. . . Ceci trouve le maximum par identifiant. Comprenez-vous comment fonctionnent les fonctions de la fenêtre? Je devrais également noter que la sous-requête n'est pas nécessaire. Je trouve juste que cela rend la requête plus lisible. –

+0

mais je veux trouver la ligne maximale où le rôle = rouge par ID. Ensuite, une fois que j'ai ces lignes identifiées, appliquer une déclaration conditionnelle de. Si (cette ligne max nous venons de trouver) cette ligne = histid n'est pas nulle et style = c l'assigné. sinon non affecté. –