我如何有条件地将进行中的行号的值增加1

问题描述 投票:0回答:1

我需要将进行中的行号的值增加1。当行遇到另一种情况时,我需要重置计数器。用一个例子最容易解释:

+---------+------------+------------+-----------+----------------+
| Acct_ID |  Ins_Date  | Acct_RowID | indicator | Desired_Output |
+---------+------------+------------+-----------+----------------+
|    5841 | 07/11/2019 |          1 |         1 |              1 |
|    5841 | 08/11/2019 |          2 |         0 |              2 |
|    5841 | 09/11/2019 |          3 |         0 |              3 |
|    5841 | 10/11/2019 |          4 |         0 |              4 |
|    5841 | 11/11/2019 |          5 |         1 |              1 |
|    5841 | 12/11/2019 |          6 |         0 |              2 |
|    5841 | 13/11/2019 |          7 |         1 |              1 |
|    5841 | 14/11/2019 |          8 |         0 |              2 |
|    5841 | 15/11/2019 |          9 |         0 |              3 |
|    5841 | 16/11/2019 |         10 |         0 |              4 |
|    5841 | 17/11/2019 |         11 |         0 |              5 |
|    5841 | 18/11/2019 |         12 |         0 |              6 |
|    5132 | 11/03/2019 |          1 |         1 |              1 |
|    5132 | 12/03/2019 |          2 |         0 |              2 |
|    5132 | 13/03/2019 |          3 |         0 |              3 |
|    5132 | 14/03/2019 |          4 |         1 |              1 |
|    5132 | 15/03/2019 |          5 |         0 |              2 |
|    5132 | 16/03/2019 |          6 |         0 |              3 |
|    5132 | 17/03/2019 |          7 |         0 |              4 |
|    5132 | 18/03/2019 |          8 |         0 |              5 |
|    5132 | 19/03/2019 |          9 |         1 |              1 |
|    5132 | 20/03/2019 |         10 |         0 |              2 |
+---------+------------+------------+-----------+----------------+

我要创建的列是'Desired_Output'。从该表可以看出,我需要使用“指标”列。我希望下一行为n+1;除非下一行是1。再次遇到值1时,计数器需要复位。

我已经尝试使用某种循环方法,但这没有产生预期的结果。

这是否有可能?

sql sql-server sql-server-2008
1个回答
0
投票

技巧是识别从指示器1开始到下一个1的连续行组。这是通过使用cross applyAcct_RowID查找indicator = 1并将其用作Grp_RowID并在partition by窗口功能中用作row_number()来实现的>

select  *,
        Desired_Output = row_number() over (partition by t.Acct_ID, Grp_RowID 
                                                order by Acct_RowID)
from    your_table t
        cross apply
        (
            select  Grp_RowID     = max(Acct_RowID)
            from    your_table x
            where   x.Acct_ID     = t.Acct_ID
            and     x.Acct_RowID <= t.Acct_RowID
            and     x.indicator   = 1
        ) g
© www.soinside.com 2019 - 2024. All rights reserved.