2016-08-05 10 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」を計算しようとしています。

は、説明するのはあまりにも複雑ではないのですが、私は試すことを願っています。IDで

= 1 Amount_To_Takeが初めて0どこG_Ind = 1です。

*最初にG_Ind = 1(内部rank_dateに追加しました - rank_date_internal_forIndGを追加した場合)の例外を除いて、Amount_To_Takeにゼロを設定します。

私の問題は、IDでは際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のときは最後ではないからではありません。

これらは現在すべての選択肢ですので、残りの組み合わせについては気にしないでください。

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; 

あなたが最後を取得することができます:

答えて

0

うーん、あなたのように5番目の列を取得することができます(ID = 5と他の2つから4つの間diffrenceときケース)これに対処する方法の提案をここに幸せ列:

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; 
関連する問題