[LeetCode] 550. Game Play Analysis IV

2022. 12. 7. 19:49TIL💡/Database

이번 문제도 튜플을 생성해서 풀면 간단한 문제이다.

그런데 GROUP BY를 안 쓰고 그냥 MIN으로 구했더니 리트코드가 터져버리더라...;;

다시 한 번 SQL 쿼리에도 효율성이 큰 문제임을 깨달으면서 이번 문제를 풀어나갔다.

 

크게 Activity 테이블을 3번 쓴다. 한 번은 데이터를 크게 추출하는 베이스 테이블로, 다른 하나는 플레이어별 최초 접속 일자 추출용, 나머지 하나는 전체 플레이어 수를 추출하는 데 사용된다.

 

복잡해보여도 하나하나 블록 쌓듯이 쿼리를 조합해나가면 어렵지 않게 풀 수 있다.

 

그리고 여기서 이전 날을 구할 때 DATE_SUB 함수를 INTERVAL과 함께 쓰는 것을 기억해두자.

 

SELECT
    ROUND(
        COUNT(A1.player_id)
        / (SELECT COUNT(DISTINCT A3.player_id) FROM Activity A3)
    , 2) As fraction
FROM
    Activity A1
WHERE
    (A1.player_id, DATE_SUB(A1.event_date, INTERVAL 1 DAY)) IN (
        SELECT
            A2.player_id,
            MIN(A2.event_date)
        FROM
            Activity A2
        GROUP BY
            A2.player_id
    );