Подход CTE, чтобы избежать обновления курсора каждой строки таблицы на результат предыдущих наборов строк - PullRequest
0 голосов
/ 03 октября 2019

Я хочу обновлять каждую строку итеративно, когда строка обновляется, она должна использовать предыдущие последние обновленные значения, но используя подход CTE, чтобы избежать курсора

Псевдокод курсора:

Cursor{

--when cursor on row 1
update @table
set Balance=dbo.somefunction(sum of balance before row<1 i.e 0)

--when cursor on row 2
update @table
set Balance=dbo.somefunction(sum of balance before row<2 i.e 950)
.
.
.

};

Declare @table table(id int,col int,col2 int,balance int);

INSERT INTO @table
values(1,200,50,0),(2,60,150,0),(3,250,3,0),(4,65,2,0);

Конечный результат будет выглядеть так:

1   200 50  950
2   60  150 1
3   250 3   3
4   65  2   50

1 Ответ

0 голосов
/ 03 октября 2019

Функция row_number () обычно используется для идентификации предыдущих строк.

with cte as (
  select *, row_number() over (order by id) as row
  from table
)
select *, 
       (select sum(cte2.balance)
        from cte as cte2
        where cte2.row < cte1.row) as SumBalance
from cte as cte1
order by id

Хотя в вашем столбце id уже может выполняться та же задача по идентификации предыдущих строк, поэтому вам на самом деле не нужноCTE.

select *, 
       (select sum(cte2.balance)
        from cte as cte2
        where cte2.id < cte1.id) as SumBalance
from cte as cte1
order by id

И, наконец, вы можете использовать переменную для хранения и увеличения суммы сальдо, так что вам даже не нужен подзапрос.

declare @SumBalance int = 0

select *, @SumBalance = @SumBalance + Balance as SumBalance
from table
order by id
...