Grokking SQL for Tech Interviews
Ask Author
Back to course home

0% completed

Vote For New Content
5. Game Play Analysis IV
Table of Contents

Contents are not accessible

Contents are not accessible

Contents are not accessible

Contents are not accessible

Contents are not accessible

Problem

Table: Activity

+--------------+---------+
| Column Name  | Type    |
+--------------+---------+
| player_id    | int     |
| device_id    | int     |
| event_date   | date    |
| games_played | int     |
+--------------+---------+
(player_id, event_date) is the primary key (combination of columns 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 Definition

Write a solution to report the fraction of players that logged in again on the day after the day they first logged in, rounded to 2 decimal places. In other words, you need to count the number of players that logged in for at least two consecutive days starting from their first login date, then divide that number by the total number of players.

Example

Image

Output

Image

Try It Yourself

MYSQL
MYSQL

. . . .

Solution

To determine the fraction of players who logged in again on the day after their first login, we can follow a systematic approach that involves identifying players with consecutive logins and calculating the required fraction. This solution leverages SQL's window functions and subqueries to efficiently perform the necessary computations.

  • Identify Players with Consecutive Logins: Find players who have at least one login event where they logged in on the day immediately following another login event.
  • Calculate Total Number of Players: Determine the total count of unique players in the Activity table.
  • Compute the Fraction: Divide the number of players with consecutive logins by the total number of players and round the result to two decimal places.

SQL Query

SELECT ROUND( COUNT(DISTINCT player_id) / (SELECT COUNT(DISTINCT player_id) FROM Activity), 2 ) AS fraction FROM Activity a WHERE EXISTS ( SELECT 1 FROM Activity b WHERE b.player_id = a.player_id AND b.event_date = DATE_SUB(a.event_date, INTERVAL 1 DAY) );

Step-by-Step Approach

Step 1: Identify Players with Consecutive Logins

Find all players who have logged in on at least two consecutive days. This involves checking if a player has a login event where the previous day also has a login event.

SQL Query:

SELECT DISTINCT a.player_id FROM Activity a WHERE EXISTS ( SELECT 1 FROM Activity b WHERE b.player_id = a.player_id AND b.event_date = DATE_SUB(a.event_date, INTERVAL 1 DAY) );

Explanation:

  • SELECT DISTINCT a.player_id FROM Activity a:
    • Retrieves unique player_ids from the Activity table.
  • WHERE EXISTS (...):
    • Ensures that for each record in a, there exists at least one corresponding record in b where:
      • b.player_id = a.player_id:
        • The same player is considered.
      • b.event_date = DATE_SUB(a.event_date, INTERVAL 1 DAY):
        • The login date in b is exactly one day before the login date in a.
  • SELECT 1:
    • A placeholder value used in the EXISTS clause; it checks for the existence of a matching record without returning any actual data.

Output After Step 1:

+-----------+ | player_id | +-----------+ | 1 | +-----------+

Step 2: Calculate Total Number of Players

Determine the total number of unique players in the Activity table. This serves as the denominator for calculating the fraction.

SQL Query:

SELECT COUNT(DISTINCT player_id) AS total_players FROM Activity;

Explanation:

  • SELECT COUNT(DISTINCT player_id) AS total_players:
    • Counts the number of unique player_ids in the Activity table.
  • FROM Activity:
    • Specifies the Activity table as the data source.

Output After Step 2:

+--------------+ | total_players| +--------------+ | 3 | +--------------+

Step 3: Count Players with Consecutive Logins

Count the number of distinct players who have logged in on consecutive days, as identified in Step 1.

SQL Query:

SELECT COUNT(DISTINCT a.player_id) AS consecutive_login_players FROM Activity a WHERE EXISTS (...);

Explanation:

  • SELECT COUNT(DISTINCT a.player_id) AS consecutive_login_players:
    • Counts the number of unique players who meet the consecutive login criteria.

Output After Step 3:

+--------------------------+ | consecutive_login_players| +--------------------------+ | 1 | +--------------------------+

Step 4: Compute the Fraction of Players with Consecutive Logins

Calculate the fraction of players who logged in on consecutive days by dividing the number of players identified in Step 3 by the total number of players from Step 2. Round the result to two decimal places.

SQL Query:

SELECT ROUND( COUNT(DISTINCT player_id) / (SELECT COUNT(DISTINCT player_id) FROM Activity), 2 ) AS fraction FROM Activity a WHERE EXISTS (...);

Explanation:

  • ROUND(..., 2) AS fraction:
    • Rounds the calculated fraction to two decimal places and labels it as fraction.

Output After Step 4:

+----------+ | fraction | +----------+ | 0.33 | +----------+

Explanation of Output:

  • Calculation:
    • Number of Players with Consecutive Logins: 1 (Player 1)

    • Total Number of Players: 3 (Players 1, 2, and 3)

    • Fraction: 1 / 3 ≈ 0.3333

    • Rounded to Two Decimal Places: 0.33

.....

.....

.....

Like the course? Get enrolled and start learning!

Table of Contents

Contents are not accessible

Contents are not accessible

Contents are not accessible

Contents are not accessible

Contents are not accessible