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

댓글