sql查询语句实现两列相减循环求差的算法解决方法

sql查询语句实现两列相减循环求差的算法
id  name   nl    nl1     cha
1     a          5      0         5
2     a          4      2         7
3     a          1      8         0
1     b          2       0        2
2     b          2       1        3


现在要求出cha这一列的数值,也就是nl-nl1,但是第二列name等于a的这个差就是(5+4)-(2+0)以此类推,但是不知道name字段具体有几例,可以是三列也可以是两列或者5列 等不确定的,这个需要怎么实现 大神求救啊
------解决思路----------------------
--查询
;WITH CTE AS(
SELECT id,name,nl,nl1
,nl-nl1 cha
FROM TB
WHERE id=1
UNION ALL
SELECT T1.id,T1.name,T1.nl,T1.nl1
,T2.cha+T1.nl-T1.nl1
FROM TB T1
JOIN CTE T2 ON T1.name=T2.name AND T1.id=T2.id+1
)
SELECT * FROM CTE
ORDER BY name,id
--更新
;WITH CTE AS(
SELECT id,name,nl,nl1
,nl-nl1 cha
FROM TB
WHERE id=1
UNION ALL
SELECT T1.id,T1.name,T1.nl,T1.nl1
,T2.cha+T1.nl-T1.nl1
FROM TB T1
JOIN CTE T2 ON T1.name=T2.name AND T1.id=T2.id+1
)
UPDATE T1
SET cha=T2.cha
FROM TB T1
JOIN CTE T2 ON T1.name=T2.name AND T1.id=T2.id

------解决思路----------------------
SQL 2012+可以用开窗函数
------解决思路----------------------


declare @tab table(id int,name varchar(30), nl int,nl1 int)
insert into @tab
select 1,     'a',          5,      0  union all
select 2,     'a',          4,      2  union all
select 3,     'a',          1,      8  union all
select 1,     'b',          2,       0  union all
select 2,     'b',          2,       1   
; with sel 
as(select id,name,nl,nl1,nl-nl1 as cha from @tab where id=1
union all
select a.id,a.name,a.nl,a.nl1,b.cha+a.nl-a.nl1
from @tab a
join sel b on a.id=b.id+1 and a.name=b.name
)
select * from sel
order by name,id