列匹配值时的高效ROW_NUMBER增量

DeC*_*Caf 1 sql t-sql sql-server-2012

我试图找到一种有效的方式来获得列Expected仅低于IdState.我想要的是Expected每次增加的数量State0(按顺序排列Id).

+----+-------+----------+
| Id | State | Expected |
+----+-------+----------+
|  1 |     0 |        1 |
|  2 |     1 |        1 |
|  3 |     0 |        2 |
|  4 |     1 |        2 |
|  5 |     4 |        2 |
|  6 |     2 |        2 |
|  7 |     3 |        2 |
|  8 |     0 |        3 |
|  9 |     5 |        3 |
| 10 |     3 |        3 |
| 11 |     1 |        3 |
+----+-------+----------+
Run Code Online (Sandbox Code Playgroud)

我已经设法使用以下SQL完成此操作,但是当数据集很大时执行时间非常短:

WITH Groups AS 
(
   SELECT Id, ROW_NUMBER() OVER (ORDER BY Id) AS GroupId FROM tblState WHERE State=0
)
SELECT S.Id, S.[State], S.Expected, G.GroupId FROM tblState S
   OUTER APPLY (SELECT TOP 1 GroupId FROM Groups WHERE Groups.Id <= S.Id ORDER BY Id DESC) G
Run Code Online (Sandbox Code Playgroud)

是否有更简单,更有效的方法来产生这种结果?(在SQL Server 2012或更高版本中)

Gor*_*off 5

只需使用累计金额:

select s.*,
       sum(case when state = 0 then 1 else 0 end) over (order by id) as expected
from tblState s;
Run Code Online (Sandbox Code Playgroud)