~고군분투 인생살이~

[550] Game Play Analysis IV 본문

SQL/LEETCODE

[550] Game Play Analysis IV

소금깨 2022. 6. 26. 21:24

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 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 an SQL query 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 query 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

 


with temp as(
	select player_id,
    		event_date,
            lead(event_date) over(partition by player_id order by event_date) as next_login,
            row_number() over(partition by player_id order by event_date) as new_date_id
    from activity)
   
select round(count(player_id)/(select count(distinct player_id) from activity),2) as fraction
from temp
where new_date_id = 1 
and next_login is not null 
and datediff(next_login,event_date) = 1
select round(count(player_id)/(select count(distinct player_id) from activity),2)  as fraction
from (select player_id
             ,event_date
             ,lead(event_date) over (partition by player_id order by event_date) as next_login
             ,row_number() over (partition by player_id order by event_date) as new_date_id
     from activity) as temp 
where new_date_id = 1 -- 처음 로그인 한 날 
and next_login is not null -- 다음에도 로그인 했음을 나타냄
and datediff(next_login,event_date) = 1  -- 다음 로그인 날짜랑 이벤트 데이트의 차이가 1
WITH CTE AS (
            SELECT player_id,
                  min(event_date) as event_start_date
            from Activity
            group by player_id )

SELECT round((count(distinct c.player_id) / (select count(distinct player_id) from activity)),2)as fraction
FROM CTE c
	JOIN Activity a
		on c.player_id = a.player_id
		and datediff(c.event_start_date, a.event_date) = -1

'SQL > LEETCODE' 카테고리의 다른 글

[1142] User Activity for the Past 30 Days II  (0) 2022.06.28
[1141] User Activity for the Past 30 Days I  (0) 2022.06.28
[534] Game Play Analysis III  (0) 2022.06.26
[1113] Reported Posts  (0) 2022.06.26
[1084] Sales Analysis III  (0) 2022.06.26
Comments