Quantcast
Channel: SQL Server Database Engine forum
Viewing all articles
Browse latest Browse all 5123

Running Total Variation Query Time Optimization

$
0
0

Hi all, 

I've been struggling with this query for a while. I need to set a customer specific running total for 10 million rows (reset for every customer). But every time the number goes negative, I need to set it as zero.

For example,

member no              amount            wallet

member1                 400                      400

member1                 -500                     0

member1                  200                    200

member2                  700                    700

member2                 -200                    500

Query:

DECLARE @member float
DECLARE @prev_member float
DECLARE @amount float
DECLARE @wallet float

DECLARE db_cursor CURSOR FOR  
SELECT [Member no], [Transaction Amount] 
FROM [wallet_master_3]
ORDER BY [Member No], [rownum]
FOR UPDATE

OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @member, @amount

SET @prev_member = @member
set @wallet=0

WHILE @@FETCH_STATUS = 0
BEGIN   
       IF @prev_member <> @member set @wallet=0

       SET @wallet = @wallet + @amount

       IF @wallet < 0 SET @wallet = 0

       UPDATE [wallet_master_3] SET walletsize = @wallet
       WHERE CURRENT OF db_cursor

       set @prev_member=@member

       FETCH NEXT FROM db_cursor INTO @member, @amount
END   

CLOSE db_cursor   
DEALLOCATE db_cursor

I've tried using a cursor. In five minutes, it ran 17,000 rows but after running it for 15 hours, the code only manages to set the running total for 175,000 rows. I'm not exactly sure why. Is there a faster approach I can use? 

Thanks!


Viewing all articles
Browse latest Browse all 5123

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>