MySQL 리트코드 | Game Play Analysis IV (DATE_ADD 함수, DATE_SUB 함수)

    728x90

     

    문제

    https://leetcode.com/problems/game-play-analysis-iv/description/?envType=study-plan-v2&envId=top-sql-50

    • 플레이어 별 첫 번째 접속일자 기준 다음 날 연속 접속을 한 플레이어의 비율 구하기  

     

    테이블

    Activity player_id device_id event_date games_played
    1 2 2025-03-01 5
    1 2 2025-03-02 6
    2 3 2025-06-25 1
    3 1 2025-03-02 0
    3 4 2025-07-03 5
    • 각 플레이어 별로 첫 번째 접속일자 행의 event_date와 그 다음 접속일자만 비교해보면 됨.
      • (player_id = 1)인 경우만 첫 번째 접속일자 다음 날 재접속을 했음.
    • 전체 3명의 플레이어 중 재접속 플레이어는 1명으로 비율은 (1 / 3) = 0.33 

     

    풀이과정

    ▶ DATE_ADD ( ) 사용 정답

    # 플레이어 별 '첫 번째 접속 및 연속 접속 기록'이 있는 행 추출하기

    • WHERE 조건절에 IN() 함수 및 서브쿼리 활용 
      • (플레이어 별, 접속일자) 조합이 서브쿼리 결과테이블 정보에 포함되는 경우만 추출.
      • IN() 함수 내에 작성한 서브쿼리는 플레이어 별 연속 접속일자가 있는 경우만 반환하고 있음.
        각 플레이어별로 그룹화를 한 뒤 DATE_ADD() 함수를 통해 접속일자에 하루를 더한 것(= 즉, 접속일자 간 차이가 하루인 것)최초 접속일자(MIN함수 활용)를 반환하고 있음. 

    DATE_ADD(날짜, INTERVAL 기간 지정) 함수는 하단 게시글 참고

    2025.03.17 - [데이터분석 과정/SQL] - MySQL 리트코드 | Rising Temperature (DATEDIFF, TIMESTAMPDIFF, DATE_ADD, DATE_SUB)

     

    MySQL 리트코드 | Rising Temperature (DATEDIFF, TIMESTAMPDIFF, DATE_ADD, DATE_SUB)

    문제https://leetcode.com/problems/rising-temperature/description/?envType=study-plan-v2&envId=top-sql-50전 날(어제)의 기온에 비해 오늘의 기온이 더 높은 날의 id 찾기 테이블WeatheridrecordDatetemperature12025-01-011022025-01-0225

    nasena.tistory.com

     

    # 재접속 플레이어 비율 구하기

    • WHERE 조건절에 대한 결과로 '연속 접속이 있는 플레이어 정보' 만 테이블로 추출된 상태
    • (중복 제거된) 연속 접속이 있는 플레이어 수 / (중복 제거된) 전체 플레이어 수
      • (중복 제거된) 전체 플레이어 수를 구하기 위해 서브쿼리 사용함.

     

    # 정답

    • ROUND() 함수로 결과값을 소수점 둘째자리로 맞춤.
    1
    2
    3
    SELECT ROUND(COUNT(DISTINCT player_id) / (SELECT COUNT(DISTINCT player_id) FROM Activity), 2) fraction
    FROM Activity
    WHERE (player_id, event_date) IN(SELECT player_id, MIN(DATE_ADD(event_date, INTERVAL 1 DAY)) FROM Activity GROUP BY player_id)
    cs

     

    다른 사람 풀이 참고

    ▶ DATE_SUB ( ) 사용 정답

    # 플레이어 별 '첫 번째 접속 및 연속 접속 기록'이 있는 행 추출하기

    • WHERE 조건절에 IN() 함수 및 서브쿼리 활용 
      • (플레이어 별, 접속일자에서 하루 뺀 날짜) 조합이 서브쿼리 결과테이블 정보에 포함되는 경우만 추출. DATE_SUB() 함수 활용함.
      • IN() 함수 내에 작성한 서브쿼리는 플레이어 별 연속 접속일자가 있는 경우만 반환하고 있음.
        각 플레이어별로 그룹화를 한 뒤 최초 접속일자(MIN함수 활용)를 반환하고 있음. 

     

    # 재접속 플레이어 비율 구하기

    • WHERE 조건절에 대한 결과로 '연속 접속이 있는 플레이어 정보' 만 테이블로 추출된 상태
    • (중복 제거된) 연속 접속이 있는 플레이어 수 / (중복 제거된) 전체 플레이어 수
      • (중복 제거된) 전체 플레이어 수를 구하기 위해 서브쿼리 사용함.

     

    # 정답

    • ROUND() 함수로 결과값을 소수점 둘째자리로 맞춤.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    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
      )
    cs

     

     

     

    728x90

    댓글