SQL基于另一列的增量

Wal*_*987 3 sql sql-server

我有一个表,需要为其分配编号规则,然后根据另一列中的值再次将编号规则重新启动为 1。

这是我的桌子:

日期 姓名 指标
2022年1月12日 测试1 1
2022年2月12日 测试2 无效的
2022年3月12日 测试3 无效的
2022年4月12日 测试4 无效的
2022年5月12日 测试5 1
2022年6月12日 测试6 无效的
2022年7月12日 测试7 1
2022年8月12日 测试8 无效的

我需要的是在末尾添加一个“实例”列,该列只是继续数字序列,直到再次遇到“指示器”列中带有 1 的行,然后重置。

所以我想要的结果是:

日期 姓名 指标 实例
2022年1月12日 测试1 1 1
2022年2月12日 测试2 无效的 2
2022年3月12日 测试3 无效的 3
2022年4月12日 测试4 无效的 4
2022年5月12日 测试5 1 1
2022年6月12日 测试6 无效的 2
2022年7月12日 测试7 1 1
2022年8月12日 测试8 无效的 2

我试过玩DENSE_RANK() over (Order by Date)

但我明白最终会这样:

日期 姓名 指标 实例
2022年1月12日 测试1 1 1
2022年2月12日 测试2 无效的 2
2022年3月12日 测试3 无效的 3
2022年4月12日 测试4 无效的 4
2022年5月12日 测试5 1 1
2022年6月12日 测试6 无效的 6
2022年7月12日 测试7 1 1
2022年8月12日 测试8 无效的 8

序列继续,它不会在 1(在指示器列中)处重置。

The*_*ler 7

你可以做:

select x.*, row_number() over(partition by g order by date) as instance
from (select t.*, sum(indicator) over(order by date) as g from t) x
Run Code Online (Sandbox Code Playgroud)

结果:

 Date        Name   Indicator  g  instance 
 ----------- ------ ---------- -- -------- 
 2022-01-12  Test1  1          1  1        
 2022-02-12  Test2  null       1  2        
 2022-03-12  Test3  null       1  3        
 2022-04-12  Test4  null       1  4        
 2022-05-12  Test5  1          2  1        
 2022-06-12  Test6  null       2  2        
 2022-07-12  Test7  1          3  1        
 2022-08-12  Test8  null       3  2        
Run Code Online (Sandbox Code Playgroud)

请参阅db<>fiddle处的运行示例。