开发者

SQL Server Multiple Running Totals

开发者 https://www.devze.com 2022-12-30 02:47 出处:网络
I have a table like this UserIDScoreDate 56开发者_如何学Go2010-1-1 782010-1-2 542010-1-3 632010-1-4 742010-1-5

I have a table like this

UserID  Score  Date
5       6   开发者_如何学Go   2010-1-1
7       8      2010-1-2
5       4      2010-1-3
6       3      2010-1-4
7       4      2010-1-5
6       1      2010-1-6

I would like to get a table like this

UserID  Score  RunningTotal Date
5       6      6            2010-1-1
5       4      10           2010-1-3
6       3      3            2010-1-4
6       1      4            2010-1-6
7       8      8            2010-1-2
7       4      12           2010-1-5

Thanks!


Unlike Oracle, PostgreSQL and even MySQL, SQL Server has no efficient way to calculate running totals.

If you have few scores per UserID, you can use this:

SELECT  userId,
        (
        SELECT  SUM(score)
        FROM    scores si
        WHERE   si.UserID = so.UserID
                AND si.rn <= so.rn
        )
FROM    (
        SELECT  *,
                ROW_NUMBER() OVER (PARTITION BY UserID) AS rn
        FROM    scores
        ) so

, however, this will be very inefficient for larger tables.

For larger tables, you could benefit from using (God help me) a cursor.


Would something like this work for you...?

SELECT UserID, Score, 
   (SELECT SUM(Score) 
   FROM TableName innerTable 
   WHERE innerTable.UserID = outerTable.userID 
      AND innerTable.Date <= outerTable.date) AS RunningTotal
FROM TableName outerTable

This assumes, though, that a user cannot have more than one score per day. (What is your PK?)

0

精彩评论

暂无评论...
验证码 换一张
取 消