根据你的标签,可以使用LAG进行此操作,然后进行总计运行。
Dif_Last_M
。这反映了公式的“ M24-M23”部分。Dif_Last_M
<= 1,请向运行总计添加0(有效地使运行总计与上一行相同)Dif_Last_M
> 1,则将(Dif_Last_M
减去1)加到运行总计中这是假设你的源表称为#Temp并具有ID(排序值)的代码
WITH M_info AS
(SELECT ID, M, (M - LAG(M, 1) OVER (ORDER BY ID)) AS Dif_Last_M
FROM #Temp
)
SELECT ID,
M,
SUM(CASE WHEN Dif_Last_M > 1 THEN Dif_Last_M - 1 ELSE 0 END) OVER (ORDER BY ID) AS N
FROM M_info;
这是结果
ID M N
1 1 0
2 3 1
3 5 2
4 8 4
5 9 4
6 12 6
7 13 6
这是上面的db <>小提琴。它还包括其他查询,显示
请注意,尽管可以使用递归CTE进行此操作,但它们往往会出现性能问题(从根本上说,它们是循环)。如果可能的话,Soit更好(在性能方面),以避免递归CTE。