📚문제
📝풀이
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이든
분발하자