본문 바로가기

SQL/LeetCode

LeetCode 550. Game Play Analysis IV / MySQL(Medium)

728x90

📚문제

출처 : LeetCode(https://leetcode.com/problems/game-play-analysis-iv/)


📝풀이

With Temp AS
(SELECT *
FROM Activity)

SELECT ROUND(COUNT(DISTINCT player_id) / (SELECT COUNT(DISTINCT player_id) FROM TEMP), 2) AS fraction
FROM Activity
WHERE (player_id,event_date) IN (SELECT player_id
                                      , DATE_ADD(MIN(event_date), INTERVAL 1 DAY) AS next_first_login
                                 FROM Activity 
                                 GROUP BY player_id)

SELECT절 서브쿼리로 시도해봤다가 Submit에서 계속 틀려서 

어떤 부분에서 틀린건지 모르겠어서 구글링 해봤다

정말 다양한 풀이가 있었다

WITH절로 2개의 테이블을 만드는 방법, OVER(PARTITION BY) 를 이용하는 방법 등등

그 중에서 제일 간단하게 풀이한 방법이 있어서 참고했다

 

처음에 이 풀이를 보고 어떻게 답인지 이해가 되지 않았다

WHERE 서브쿼리절 안에

SELECT player_id
     , DATE_ADD(MIN(event_date), INTERVAL 1 DAY) AS next_first_login
 FROM Activity 
 GROUP BY player_id

이 쿼리를 실행하면 event_date가 존재하는 모든 행의 가장 작은 event_date에 1을 더해서

결국 모든행이 나오게 되는 것 아닌가 하고 생각했다

 

근데 일전에 풀었었던 개념과 유사하게

player_id & event_date의 고유한 조합과 모두 일치하는 행을 걸러내서 추출하는 것이 핵심이다

예를 들어서

서브쿼리절을 실행하면

player_id = 1 , event_date = '2016-03-02'

player_id = 2 , event_date = '2017-06-26'

player_id = 3 , event_date = '2016-03-03'

이렇게 나온다

 

그 후에 Activity 테이블에서 

player_id와 event_date모두가 각 행과 정확히 일치하는 행들만 골라내는 건데

player_id가 2와 3인경우는 event_date가 일치하는 경우가 없기 때문에 최종적으로 

검색되지 않는다

그래서 답처럼 1/3 => 0.333... 이 나올 수 있는것이다

 

한마디로 "처음 로그인한 날 바로 다음날에도 로그인한 기록이 Activity 테이블에 있나요 ? " 하고 걸러내는것

 

고급 스킬로 잘 풀어낸 풀이도 멋있지만

이렇게 어렵지 않은 함수들의 활용으로

(내가 새로 알게되거나 어려운 함수는 없었다. 분명 조금 더 생각하면 풀 수 있었던 문제)

푸는 게 멋있는 것 같다

SQL이든 Python이든

분발하자

 

 

 

728x90