T-SQL:使用 CTE 对值进行分组

T-SQL: group values with CTE

考虑以下数据:

DECLARE @TBL TABLE (RecordID BIGINT, 
                    ID BIGINT, 
                    RowNumber BIGINT, 
                    Amount NUMERIC(6, 2), 
                    Balance NUMERIC (6, 2)
                   )

INSERT INTO @TBL VALUES (99, 1, 1, 10, 20)
INSERT INTO @TBL VALUES (100, 3, 1, 5, 20)
INSERT INTO @TBL VALUES (101, 1, 2, 5, 20)
INSERT INTO @TBL VALUES (102, 1, 3, 10, 20)
INSERT INTO @TBL VALUES (100, 3, 2, 50, 20)

SELECT * FROM @TBL

假设在这种情况下我们有一个 table 这个数据,我想做的是在每个 ID 内,对于每个升序的行号减去余额的金额。所以,我对 balance 列的预期输出应该分别是:

10
15
5
-5
-35

我的问题是是否有任何方法可以使用 CTE 而不是游标来实现此结果?

抱歉,我没有 post 任何图片(它们更好地展示了我想要完成的事情,但论坛不允许,因为我的声誉 < 10)。

我想我明白你想要什么,是的:递归 CTE 可以为你做到。

;with CTE
as (
    select RecordID, ID, RowNumber, Amount, cast(Balance - Amount as numeric(6,2)) 'Balance'
      from @TBL as Anchor
     where rownumber = 1
    union all
    select tbl.RecordID, tbl.ID, tbl.RowNumber, tbl.Amount, cast(cte.balance - tbl.amount as numeric(6,2)) 'Balance'
      from @TBL tbl
      join CTE
        on CTE.ID = tbl.ID
       and CTE.RowNumber = tbl.Rownumber - 1
   ) 
select * from CTE
order by RecordID asc

生产:

RecordID   ID RowNumber   Amount   Balance
99          1         1    10.00     10.00
100         3         1     5.00     15.00
100         3         2    50.00    -35.00
101         1         2     5.00      5.00
102         1         3    10.00     -5.00