[MYSQL] Game Play Analysis IV

김희정·2024년 1월 19일

SQL

목록 보기
1/5

Leetcode Game Play Analysis IV

Table: Activity

+--------------+---------+
| Column Name  | Type    |
+--------------+---------+
| player_id    | int     |
| device_id    | int     |
| event_date   | date    |
| games_played | int     |
+--------------+---------+

처음 로그인한 다음날에도 로그인한 플레이어의 비율을 구하는 솔루션을 작성하세요.
즉, 첫번째 로그인일부터 이틀 이상 연속으로 로그인한 플레이어의 수를 세고 그 수를 전체 플레이어 수로 나눠야 합니다.

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
SELECT
  ROUND(COUNT(DISTINCT player_id) / (SELECT COUNT(DISTINCT player_id) FROM Activity), 2) AS fraction
FROM
  Activity
WHERE
  (player_id, DATE_SUB(event_date, INTERVAL 1 DAY))
  IN (
    SELECT player_id, MIN(event_date) AS first_login FROM Activity GROUP BY player_id
  )

DATE_ADD(기준 날짜, INTERVAL) 시간 더하기
DATE_SUB(기준 날짜, INTERVAL) 시간 빼기

  • event_date + 하루를 더한 값 = min(event_date) 과 일치하하는 player_id 구하기
  • 위 조건에 맞는 id와 select 서브쿼리를 사용해서 조건이 없을때의 id 개수를 나눠 비율을 구한다
profile
데이터 애널리스트가 되고 싶은

0개의 댓글