0% completed
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
Output
Try It Yourself
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_id
s from theActivity
table.
- Retrieves unique
WHERE EXISTS (...)
:- Ensures that for each record in
a
, there exists at least one corresponding record inb
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 ina
.
- The login date in
- Ensures that for each record in
SELECT 1
:- A placeholder value used in the
EXISTS
clause; it checks for the existence of a matching record without returning any actual data.
- A placeholder value used in the
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_id
s in theActivity
table.
- Counts the number of unique
FROM Activity
:- Specifies the
Activity
table as the data source.
- Specifies the
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
.
- Rounds the calculated fraction to two decimal places and labels it as
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
-
.....
.....
.....
Table of Contents
Contents are not accessible
Contents are not accessible
Contents are not accessible
Contents are not accessible
Contents are not accessible