我有一张包含多种序列的表格。例如:
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
--------------------------------------------------------------------
我已经构建了四个第一列,我正在尝试计算“Amount_To_Take”。
希望解释起来并不复杂,但我会尝试:
在Id = 1中,Amount_To_Take为0,其中第一次G_Ind = 1。
*在所有情况下,首次G_Ind = 1时都没有例外(根据我添加的内部rank_date - rank_date_internal_forIndG)我们将在Amount_To_Take中添加零。
我的问题是当rank_date_internal_forIndG = 2.在Id - 1,2,3,4中,我们将把amout加起来并将它放在Amount_To_Take上,这很简单:
case when rank_date_internal_forIndG = 2 and G_Ind = 1 then 0
但是如果ID为5,我们不是因为它不是最后一个。
目前这些都是我的选择,所以不要再考虑其余的组合了。很高兴在这里建议如何应对这种情况(ID = 5时的情况和其他两种情况之间的差异)
答案 0 :(得分:0)
嗯,你可以得到第五列:
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;
您可以将最后一列视为:
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;