2016-08-05 2 views
0

많은 시퀀스가있는 테이블이 있습니다. 예 :시퀀스를 식별하고 그에 따라 행동하십시오.

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 
    -------------------------------------------------------------------- 

저는 4 개의 첫 번째 열을 이미 구축했으며 "Amount_To_Take"를 계산하려고합니다.

는 너무 설명하기 복잡하지 바란다 그러나 나는 시도 할 것이다 :

식 1에서 Amount_To_Take 처음으로 0 G_Ind = 1입니다.

* G_Ind = 1 (내부 rank_date에 따라 rank_date_internal_forIndG를 추가 한 경우) 예외없이 모든 경우에 Amount_To_Take에 0을 넣을 예정입니다.

내 문제 이드에서 rank_date_internal_forIndG = 2 때입니다 - 1,2,3,4 우리가 amout를 요약하고 간단한 그것은 있도록 Amount_To_Take에 넣어가는 :

case when rank_date_internal_forIndG = 2 and G_Ind = 1 then 0 

하지만 경우에

ID가 5 일 때는 마지막 ID가 아니기 때문에 아닙니다.

이들은 현재 내 모든 옵션이므로 나머지 조합은 생각하지 않아도됩니다.

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; 

당신은 마지막을 얻을 수 있습니다 : 어떻게 (ID = 5, 다른 2 ~ 4 사이의 디퍼 런스 세라마이드 때 경우)

답변

0

는 흠, 당신은으로 다섯 번째 열을 얻을 수있는이 대처하는 제안을 여기까지 행복 열로 :

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;