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



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

例如:

我有一张桌子:

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。

您希望在一组相邻行内有一个行号。 但是您需要定义组。 它似乎是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;

试试这个:

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值的连续记录的孤岛。在外部查询中使用此字段,我们可以枚举这些岛中包含的记录,从而获得所需的序列号。

在这里演示

最新更新