Back to articles list April 28, 2020 - 6 minutes read What Is a SQL Running Total and How Do You Compute It? Dorota Wdzięczna Dorota is an IT engineer and works as a Data Science Writer for Vertabelo. She has experience as a Java programmer, webmaster, teacher, lecturer, IT specialist, and coordinator of IT systems. In her free time, she loves working in the garden, taking photos of nature, especially macro photos of insects, and visiting beautiful locations in Poland. Tags: sql learn sql window functions The SQL running total is a very common pattern, used frequently in finance and in trend analysis. In this article, you’ll learn what a running total is and how to write a SQL query to compute it. So, without further ado, let’s get started on the first part of the question. What’s a SQL Running Total? In SQL, a running total is the cumulative sum of the previous numbers in a column. Look at the example below, which presents the daily registration of users for an online shop: registration_dateregistered_userstotal_users 2020-03-053232 2020-03-061547 2020-03-07653 The first column shows the date. The second column shows the number of users who registered on that date. The third column, total_users, sums the total number of registered users on that day. For example, on the first day (2020-03-05), 32 users registered and the total value of registered users was 32. The next day (2020-03-06) 15 users registered; the total_users value became 47 (32+15). The third day (2020-03-07), six users registered and the total_users value was 53. In other words, total_users is a running value that changes from day to day. It is the total number of users on each day. The next example uses the total_running column to deal with company revenue in a similar way. Look at the table below: daterevenuetotal_revenue 2020-04-02125 000125 000 2020-04-03125 000250 000 2020-04-0420 500270 500 2020-04-05101 000371 500 For each day, the total_revenue column is calculating the amount of revenue generated up to the given day. On 2020-04-04, the company achieved a total revenue of $270,500 because that is the sum of all revenues from 2020-04-02 to 2020-04-04. Relational databases (like SQL Server, Oracle, PostgreSQL, and MySQL) and even non-relational engines like Hive and Presto provide window functions that allow us to calculate a running total. Next, we’ll talk about the SQL query that builds such a sum and learn more about window functions. How to Compute a Cumulative Sum in SQL If you would like to compute running total in SQL, you need to be familiar with the window functions provided by your database. Window functions operate on a set of rows and return an aggregate value for each row in the result set. If you are interested in learning more about window functions, try the Window Functions course on LearnSQL.com platform. The syntax of the SQL window function that computes a cumulative sum across rows is: window_function ( column ) OVER ( [ PARTITION BY partition_list ] [ ORDER BY order_list] ) It’s mandatory to use the OVER clause in a window function, but the arguments in this clause are optional. We will discuss them in the next paragraphs of this article. Example 1 In this example, we will calculate the total running sum of the registered users each day. registration_dateregistered_users 2020-03-0532 2020-03-0615 2020-03-076 This query ... SELECT registration_date,registred_users, SUM(registred_users) OVER (ORDER BY registration_date) AS total_users FROM registration; … selects the registration date for all users. We also need the sum of all users for each day, starting from the first given day (2020-03-05) to the day in that row. This is the result set: registration_dateregistered_userstotal_users 2020-03-055757 2020-03-062784 2020-03-0716100 To calculate the running total, we use the SUM() aggregate function and put the column registered_users as the argument; we want to obtain the cumulative sum of users from this column. The next step is to use the OVER clause. In our example, this clause has one argument: ORDER BY registration_date. The rows of the result set are sorted according to this column (registration_date). For each value in the registration_date column, the total sum of the previous column values is computed (i.e. the sum of the number of users before the date in the current row) and the current value (i.e. users registered on the day of the current row) is added to it. Notice that the total sum is shown in the new column, which we named total_users. In the first step (the registration date 2020-03-05), we have 57 registered users. The sum of users registered this day is the same 57. In the next step, we add to this total value (57). What do we add? The number of users registered on the current date (2020-03-06), which is 27; this gives us a running total of 84. In the last row of the result set (for the last registration date, 2020-03-07) the running total is 100. Thanks to SQL window functions, it is easy to find the cumulative total number of users during a given period of time. For example, during 2020-03-05 – 2020-03-06, the total number of registered users was 84. Example 2 In the second example, we’ll go into more details about users. We’ll show users with their countries. Look at the table below: countryregistration_dateregistered_users England2020-03-0525 England2020-03-0612 England2020-03-0710 Poland2020-03-0532 Poland2020-03-0615 Poland2020-03-076 Notice that for each day we have the number of users for each country shown separately. In this example, we will compute a separate cumulative sum of registered users for each country. This query ... SELECT country, registration_date,registred_users, SUM(registred_users) OVER (PARTITION BY country ORDER BY registration_date) AS total_users FROM registration; … calculates the sum of users for each day, first for users from England and then for users from Poland. Here’s the result set: countryregistration_dateregistered_userstotal_users England2020-03-052525 England2020-03-061237 England2020-03-071047 Poland2020-03-053232 Poland2020-03-061547 Poland2020-03-07653 For each country, each registration day gets a running total. The PARTITION BY clause in the OVER clause has the column country as its argument. This partitions rows by country, allowing SQL to compute a running total for that country only (instead of both countries together). Thus, in England from 2020-03-05 to 2020-03-07, we have a total of 47 users. For the same period in Poland, the total of registered users was 53. Example 3 In the last example, we’ll analyze the data in the competition table, which stores the columns game_id, gamer_id, game_level, competition_date, and score. game_idgame_levelgamer_idcompetition_datescore 1342020-04-024 1242020-04-035 1142020-04-042 1352020-04-021 1252020-04-032 2372020-04-074 2272020-04-086 2172020-04-072 2362020-04-081 2262020-04-091 2382020-04-072 We need to check each gamer’s total cumulative score for each day in two different games. Look at the query below, which creates this running total: SELECT game_id,game_level,gamer_id,competition_date,score, SUM(score) OVER (PARTITION BY game_id, gamer_id ORDER BY competition_date) AS total_score FROM competition; The result: game_idgame_levelgamer_idcompetition_datescoretotal_score 1342020-04-0244 1242020-04-0359 1142020-04-04211 1352020-04-0211 1252020-04-0323 2362020-04-0711 2262020-04-0812 2372020-04-0744 2272020-04-08610 2172020-04-09212 2382020-04-0722 In this result table, we can read that the gamer with ID=4 starts from a score of 4 and finishes with a total score of 11. The best was the gamer with ID=7, who finished with a total score of 12. Once again, in the OVER clause we use PARTITION BY. This time, we use a list of columns (game_id, gamer_id). This allows us to create two partitions: one for game 1 and one for game 2. Next, rows were divided by gamer_id for each game. In game 1, we have the gamers 4 and 5; in game 2, we have the gamers 6, 7, and 8. Among each group (a given gamer plays in a given game), rows are sorted by competition_date and the score from each day is summed. In each group, we can observe each gamer’s changing score in a given game. How Will You Use SQL Running Totals? Using a running total value in SQL reports can be very handy, especially for financial specialists. Therefore, it is worthwhile to know what a cumulative sum is and how to use SQL window functions to create one. This article presented a few selected use cases. For more about window functions, check out our article SQL Window Function Example With Explanations or the LearnSQL course Window Functions. Tags: sql learn sql window functions You may also like SQL Window Functions Cheat Sheet This 2-page SQL Window Functions Cheat Sheet covers the syntax of window functions and a list of window functions. Download it in PDF or PNG format. Read more When Do I Use SQL Window Functions? SQL window functions can help you quickly and accurately create useful reports and analyses. Learn more with real-world business examples. Read more What Is the Difference Between a GROUP BY and a PARTITION BY? What is the difference between a GROUP BY and a PARTITION BY in SQL queries? When should you use which? You can find the answers in today's article. Read more How to Analyze Time Series COVID-19 Data with SQL Window Functions Discover how to analyze COVID-19 time series data with the help of SQL window functions Read more SQL Course of the Month – Window Functions Find out why you should learn SQL window functions in April and why you should do it in our course. Read more Why Window Functions Are Not Allowed in WHERE Clauses Window functions can only appear in SELECT and ORDER BY but not in WHERE clauses. The reason is the logical order in which SQL queries are processed. Read more SQL Window Functions vs. GROUP BY: What’s the Difference? Window functions and GROUP BY may seem similar at first, but they’re quite different. Learn how window functions differ from GROUP BY and aggregate functions. Read more Common SQL Window Functions: Using Partitions With Ranking Functions Once you’ve learned such window functions as RANK or NTILE, it’s time to master using SQL partitions with ranking functions. Read more How to Use Rank Functions in SQL In this article, you’ll learn how to use rank functions in SQL. It’ll give you a solid foundation for getting deeper into SQL window functions. Read more SQL Window Function Example With Explanations Interested in how SQL window functions work? Scroll down to see our SQL window function example with definitive explanations! Read more Subscribe to our newsletter Join our weekly newsletter to be notified about the latest posts.