私は多くの種類のシーケンスを持つテーブルを持っています。例:シーケンスを特定してそれによって動作する
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;
あなたが最後を取得することができます: