识别顺序并按行动

时间:2016-08-05 15:00:30

标签: sql sql-server sql-server-2012 case

我有一张包含多种序列的表格。例如:

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时的情况和其他两种情况之间的差异)

1 个答案:

答案 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;