根据另一列中的值增加然后中断并重新开始

时间:2017-03-21 14:55:22

标签: sql sql-server tsql

我想增加一列,然后根据另一列中的值停止并重新开始。

例如:

我有一张桌子:

CustomerID  YearMonth   True_False  
9000        2013-01-01   0
9001        2013-02-01   0
9002        2013-03-01   0
9003        2013-04-01   0
9004        2013-05-01   0
9005        2013-06-01   1
9006        2013-07-01   0
9007        2013-08-01   0
9008        2013-09-01   0
9009        2013-10-01   1
9010        2013-11-01   0

我想实现这个目标:

CustomerID  YearMonth   True_False  Sequence
9000        2013-01-01   0            1
9001        2013-02-01   0            2
9002        2013-03-01   0            3
9003        2013-04-01   0            4 
9004        2013-05-01   0            5
9005        2013-06-01   1            0
9006        2013-07-01   0            1
9007        2013-08-01   0            2
9008        2013-09-01   0            3
9009        2013-10-01   1            0
9010        2013-11-01   0            1

所以这是基于 True_False 列。 当 True_False 为0时,则中断并重新开始。 ( True_False = 0)的序列值不需要为0也可能为NULL。

2 个答案:

答案 0 :(得分:5)

您想要在一组相邻行中包含行号。但是你需要定义组。它似乎是true_false的累积总和。

所以:

select t.*, row_number() over (partition by grp order by year_month) - 1
from (select t.*, sum(true_false) over (order by year_month) as grp
      from t
     ) t;

答案 1 :(得分:4)

试试这个:

SELECT CustomerID, YearMonth, True_False,
       CASE 
          WHEN True_False = 1 THEN 0
          ELSE ROW_NUMBER() OVER (PARTITION BY True_False, grp 
                                  ORDER BY YearMonth) 
       END AS Sequence
FROM (      
   SELECT CustomerID, YearMonth, True_False,
          ROW_NUMBER() OVER (ORDER BY YearMonth) - 
          ROW_NUMBER() OVER (PARTITION BY True_False 
                             ORDER BY YearMonth) AS grp
   FROM mytable ) AS t
ORDER BY YearMonth

查询计算字段grp,该字段标识具有相同True_False值的连续记录的岛。在外部查询中使用此字段,我们可以枚举这些岛中包含的记录,从而获得所需的序列号。

Demo here