Мне задали вопрос и попытались выяснить способ удаления курсора, но сохраняя функциональность, потому что стартовая таблица может попасть в миллионы строк.Попытка избежать использования курсора
Пример данных в таблице:
ID DollarValue Month RowNumber
1 $10 1/1/2014 1
1 $15 2/1/2014 2
1 -$40 3/1/2014 3
1 $50 4/1/2014 4
2 -$11 1/1/2014 1
2 $11 2/1/2014 2
2 $5 3/1/2014 3
Ожидаемые результаты:
ID DollarValue Month RowNumber TestVal
1 $10 1/1/2014 1 1
1 $15 2/1/2014 2 0
1 -$40 3/1/2014 3 -1
1 $50 4/1/2014 4 1
2 -$11 1/1/2014 1 -1
2 $11 2/1/2014 2 0
2 $5 3/1/2014 3 1
Вот логика (псевдокод), что происходит внутри курсора:
If a @ID <> @LastId AND @Month <> @LastMonth
Set @RunningTotal = @DollarValue
Set @LastMonth = '12/31/2099'
Set @LastID = @ID
Set @TestVal = Sign(@DollarValue)
Else
If Sign(@RunningTotal) = Sign(@RunningTotal + @DollarValue)
Set @TestVal = 0
Else
Set @TestVal = Sign(@DollarValue)
Set @RunningTotal = @RunningTotal + @DollarValue
Любая идея, как Я могу изменить это, чтобы установить на основе?
Вы смотрели в рекурсивных КТР? –
Что это в конечном итоге делает с '@ RunningTotal' и' @ TestVal'? Он пишет в другую таблицу? Что-то обновить? Было бы легче придумать эквивалент, если бы мы знали, какова конечная цель. –
http://stackoverflow.com/questions/11981979/t-sql-using-sum-for-a-running-total – HLGEM