2016-08-05 21 views
0

Ich habe eine Tabelle mit vielen Arten von Sequenzen. Zum Beispiel:Sequenz identifizieren und danach handeln

ID G_Ind Amount rnk_date 
1 1 50  1 
1 0 100  2 
1 0 50  3 
1 1 100  4 
2 0 50  1 
2 1 100  2 
2 0 50  3 
2 1 100  4 
3 0 50  1 
3 1 100  2 
3 1 50  3 
3 0 100  4 
4 0 100  1 
4 1 50  2 
4 1 100  3 
5 1 50  1 
5 1 100  2 
5 0 50  3 
5 0 100  4 
5 1 50  5 
5 1 100  6 

And my desired output is : 


    ID G_ind Amount rnk_date rank_date_internal_forIndG Amount_To_Take 
    1 1 50  1      1    0    
    1 0 100  2      NULL   100 
    1 0 50  3      NULL   50 
    1 1 100  4      2    100 
    -------------------------------------------------------------------- 
    2 0 50  1      NULL   50 
    2 1 100  2      1    0 
    2 0 50  3      NULL   50 
    2 1 100  4      2    100 
    ------------------------------------------------------------------- 
    3 0 50  1      NULL   50 
    3 1 100  2      1    0 
    3 1 50  3      2    50 
    3 0 100  4      NULL   100 
    ------------------------------------------------------------------- 
    4 0 100  1      NULL   100 
    4 1 50  2      1    0 
    4 1 100  3      2    100 
    ------------------------------------------------------------------- 
    5 1 50  1      1    0 
    5 1 100  2      2    0 
    5 0 50  3      NULL   50 
    5 0 100  4      NULL   100 
    5 1 50  5      3    50 
    5 1 100  6      4    100 
    -------------------------------------------------------------------- 

Ich habe bereits die die vier ersten Spalten gebaut und ich versuche, die „Amount_To_Take“ zu berechnen.

hoffen, dass es nicht zu kompliziert zu erklären, aber ich werde versuchen:

In Id = 1 die Amount_To_Take ist 0, wobei G_Ind = 1 zum ersten Mal.

* In allen Fällen ohne Ausnahme wenn G_Ind = 1 zum ersten Mal (nach internen rank_date habe ich hinzugefügt - rank_date_internal_forIndG) Wir werden Null in der Amount_To_Take setzen.

Mein Problem ist, wenn die rank_date_internal_forIndG = 2. Id - 1,2,3,4 wir die amout zusammenzufassen gehen und es auf dem Amount_To_Take zu setzen, so dass es einfach:

case when rank_date_internal_forIndG = 2 and G_Ind = 1 then 0 

aber im Fall Wenn ID 5 ist, sind wir nicht, weil es nicht der letzte ist.

Das sind derzeit alle meine Optionen, also denken Sie nicht an den Rest der Kombinationen. gerne Vorschläge hier, wie man mit diesem (Fall, wenn ID = 5 und die diffrence zwischen den beiden anderen vier) zu bewältigen

Antwort

0

Hmmm, können Sie die fünfte Spalte wie zu bekommen:

select t.*, 
     (case when g_ind = 1 
      then row_number() over (partition by id, g_ind order by rnkdate) 
     end) as rank_date_internal_forIndG 
from t; 

Sie können die letzte bekommen Spalte als:

select t.*, 
     (case when rank_date_internal_forIndG = 1 then 0 
      else amount 
     end) as amount_to_take 
from (select t.*, 
      (case when g_ind = 1 
        then row_number() over (partition by id, g_ind order by rnkdate) 
       end) as rank_date_internal_forIndG 
     from t 
    ) t;