LeetCode //SQL - 550. Game Play Analysis IV

550. Game Play Analysis IV

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.

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.

The result format is in the following example.
 

Example 1:

Input:
Activity table:
±----------±----------±-----------±-------------+
| player_id | device_id | event_date | games_played |
±----------±----------±-----------±-------------+
| 1 | 2 | 2016-03-01 | 5 |
| 1 | 2 | 2016-03-02 | 6 |
| 2 | 3 | 2017-06-25 | 1 |
| 3 | 1 | 2016-03-02 | 0 |
| 3 | 4 | 2018-07-03 | 5 |
±----------±----------±-----------±-------------+
Output:
±----------+
| fraction |
±----------+
| 0.33 |
±----------+
*Explanation:
Only the player with id 1 logged back in after the first day he had logged in so the answer is 1/3 = 0.33

From: LeetCode
Link: 550. Game Play Analysis IV


Solution:

Ideas:

1. FirstLogin CTE:

  • For each player_id, find the first_login_date using MIN(event_date).

2. NextDayLogin CTE:

  • Check if there exists an entry in the Activity table where the event_date is one day after the first_login_date.

3. Final Query:

  • Use COUNT(DISTINCT ndl.player_id) to count the players who logged in on the next day.
  • Use COUNT(DISTINCT fl.player_id) to get the total number of players.
  • Divide these two values and round to two decimal places using ROUND().
Code:
WITH FirstLogin AS (
    SELECT 
        player_id, 
        MIN(event_date) AS first_login_date
    FROM 
        Activity
    GROUP BY 
        player_id
),
NextDayLogin AS (
    SELECT 
        a.player_id
    FROM 
        Activity a
    JOIN 
        FirstLogin fl 
    ON 
        a.player_id = fl.player_id
    WHERE 
        a.event_date = DATE_ADD(fl.first_login_date, INTERVAL 1 DAY)
)
SELECT 
    ROUND(COUNT(DISTINCT ndl.player_id) / COUNT(DISTINCT fl.player_id), 2) AS fraction
FROM 
    FirstLogin fl
LEFT JOIN 
    NextDayLogin ndl 
ON 
    fl.player_id = ndl.player_id;

你可能感兴趣的:(LeetCode,leetcode,sql,数据库)