728x90
문제
- 플레이어 별 첫 번째 접속일자 기준 다음 날 연속 접속을 한 플레이어의 비율 구하기
테이블
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 기간 지정) 함수는 하단 게시글 참고
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
'데이터분석 과정 > SQL' 카테고리의 다른 글
MySQL 리트코드 | Biggest Single Number (WHERE절, FROM절 서브쿼리) (0) | 2025.04.03 |
---|---|
MySQL 리트코드 | Immediate Food Delivery Ⅱ (WHERE절 서브쿼리 활용) (0) | 2025.04.01 |
MySQL 리트코드 | Monthly Transactions I (DATE_FORMAT 함수_날짜 형식 지정) (0) | 2025.03.31 |
MySQL 리트코드 | Not Boring Movies (%, MOD함수) (0) | 2025.03.28 |
MySQL 리트코드 | Confirmation Rate (AVG 함수 내 조건문 사용법) (0) | 2025.03.27 |
댓글