Description

Table: Activity

Column NameType
player_idint
device_idint
event_datedate
games_playedint
  • (player_id, event_date) is the primary key (column with unique values) of this table.
  • This table shows the activity of players of some games.
  • Each row is a record of a player who logged in and played a number of games (possibly 0) before logging out on someday using some device.

Problem Statement

Write a solution to report for each player and date, how many games played so far by the player. That is, the total number of games played by the player until that date. Check the example for clarity.

Return the result table in any order. The result format is in the following example.

Example 1:

Input:

  • Activity table:
player_iddevice_idevent_dategames_played
122016-03-015
122016-05-026
132017-06-251
312016-03-020
342018-07-035

Output:

player_idevent_dategames_played_so_far
12016-03-015
12016-05-0211
12017-06-2512
32016-03-020
32018-07-035

Explanation:

  • For the player with id 1, 5 + 6 = 11 games played by 2016-05-02, and 5 + 6 + 1 = 12 games played by 2017-06-25.
  • For the player with id 3, 0 + 5 = 5 games played by 2018-07-03.

Note that for each player we only care about the days when the player logged in.

Solution

The problem essentially wants to find rolling sum of games played by each player. The rolling sum can be implemented using window functions in SQL. In this case, window is defined by partitioning player_id and ordering the window by event_date column. You can calculate sum of games played for each window using SUM() window function.

1SELECT player_id, event_date,
2    SUM(games_played) OVER (PARTITION BY player_id ORDER BY event_date) AS games_played_so_far
3    FROM Activity;