[LeetCode Medium] 550. Game Play Analysis IV

2024. 1. 5. 13:28·SQL 문제 풀이
목차
  1. 테이블 정보
  2. 문제
  3. 결과 예시
  4. 정답 코드 (MySQL)
  5. 문제 풀이

테이블 정보

 

문제

Write a solution to report the fraction of players that logged in again on the day after the day they first logged in, rounded to 2 decimal places. 

In other words, you need to count the number of players that logged in for at least two consecutive days starting from their first login date, then divide that number by the total number of players.

 

결과 예시

 

 

정답 코드 (MySQL)

WITH check_login AS (
    SELECT player_id,
            DATEDIFF(event_date, MIN(event_date) OVER(PARTITION BY player_id)) = 1 as login
    FROM Activity
)

SELECT ROUND(SUM(login) / COUNT(DISTINCT player_id), 2) as fraction
FROM check_login;

 

 

문제 풀이

1. PARTITON BY

문제에서 처음 로그인한 다음 날에 다시 로그인한 플레이어의 비율을 보고자하므로

DATEDIFF 함수를 통해 두 날짜 차이가 1이 되는 행을 찾아야한다.

이때 player_id 별로 로그인 날짜 차이 여부를 확인해야 하므로, PARTITION BY를 사용해 계산하도록 한다.

 

PARTITON BY GROUP BY
레코드가 줄어들지 않고
행을 집약한 결과를 보여주지 않는다.
즉, 모든 데이터를 다 보여줌
group에 따라 행을 집약한 결과를 보여준다.
집계 함수가 데이터를 하나로 합쳐주는 과정에서,
기존의 상세 데이터들을 잃게 된다.

 

 

GROUP BY를 사용했을 때의 코드와 결과

SELECT player_id, 
        DATEDIFF(event_date, MIN(event_date)) = 1 as login
FROM Activity
GROUP BY player_id;

 

 

 

PARTITION BY를 사용했을 때의 코드와 결과

SELECT player_id, 
        DATEDIFF(event_date, MIN(event_date) OVER(PARTITION BY player_id)) = 1 as login
FROM Activity;

 

 

위 결과를 통해 GROUP BY와 PARTITION BY의 차이를 확실히 확인할 수 있다.

 

2. WITH 절

나의 경우, PARTITION BY를 사용하여 날짜 차이를 구하는 쿼리를 WITH 절에 넣어주었다.

WITH 절을 사용하면, 하나 이상의 서브쿼리에서 반환된 데이터를 단일 쿼리에서 재사용할 수 있다.

이를 통해 코드의 중복을 줄이고, 쿼리의 가독성을 향상시킬 수 있다는 장점이 존재한다.

 

WITH check_login AS (
    SELECT player_id,
            DATEDIFF(event_date, MIN(event_date) OVER(PARTITION BY player_id)) = 1 as login
    FROM Activity
)

 

3. ROUND() 함수

소수점 이하 2자리로 반올림하여 나타내라는 문제 조건이 있었으므로 ROUND() 함수를 사용해준다.

check_login에서 login 컬럼 값들의 합과 player_id 수를 나눠주면된다.

SELECT ROUND(SUM(login) / COUNT(DISTINCT player_id), 2) as fraction
FROM check_login;

 

참고로 문제에서 " 첫 번째 로그인일부터 이틀 이상 연속으로 로그인한 플레이어의 수를 센다 "라고 했는데

아래와 같이 3일 연속으로 로그인을 했다고 하더라도,

player_id device_id event_date games_played
1 2 2016-03-01 5
1 2 2016-03-02 6
1 2 2016-03-03 4
2 3 2017-06-25 1
3 1 2016-03-02 0
3 4 2018-07-03 5

 

DATEDIFF에서 DATEDIFF(event_date, MIN(event_date) OVER(PARTITION BY player_id))

유저 별, 최초 로그인한 날짜를 기준으로 모든 로그인 날짜들과의 차이를 구하는 것이기 때문에

player_id login
1 0
1 1
1 0
2 0
3 0
3 0

 

마지막 SELECT문을 통해 조회할 때

ROUND(SUM(login) / COUNT(DISTINCT player_id), 2) 형태로 값을 구해도 문제가 없게 된다.

 

 

 

 

'SQL 문제 풀이' 카테고리의 다른 글

[프로그래머스 Level 4] 우유와 요거트가 담긴 장바구니  (0) 2024.01.25
[LeetCode Hard] 601. Human Traffic of Stadium  (0) 2024.01.16
[LeetCode Medium] 1341. Movie Rating  (0) 2024.01.12
[LeetCode Hard] 185. Department Top Three Salaries  (2) 2024.01.07
[프로그래머스 Level 4] 입양 시각 구하기 (2)  (0) 2024.01.04
  1. 테이블 정보
  2. 문제
  3. 결과 예시
  4. 정답 코드 (MySQL)
  5. 문제 풀이
'SQL 문제 풀이' 카테고리의 다른 글
  • [LeetCode Hard] 601. Human Traffic of Stadium
  • [LeetCode Medium] 1341. Movie Rating
  • [LeetCode Hard] 185. Department Top Three Salaries
  • [프로그래머스 Level 4] 입양 시각 구하기 (2)
개발이조아용
개발이조아용
IT 개발에서 배운 성장의 기록을 작성합니다.
  • 개발이조아용
    계속 하다 보면?!
    개발이조아용
  • 전체
    오늘
    어제
    • 분류 전체보기 (64)
      • Tibero DB (Tmax AI Bigdata .. (7)
      • Git (2)
      • CI CD (2)
      • Redis (3)
      • SpringBoot (15)
      • SQL 문제 풀이 (8)
      • Apache Kafka (8)
        • 오류 해결 (3)
        • 개념 정리 (4)
        • 보안 (1)
      • Nginx (3)
      • SW마에스트로 (3)
      • Kubernetes (4)
      • AWS (5)
      • gRPC (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Kafka 오류
    Kafka 개념
    MSA
    Git
    grpc
    Tibero
    nginx
    leetcode
    SQL
    Redis 개념
    redis script
    DynamoDB 연동
    SASL 인증
    KAFKA
    sql 문제
    SpringBoot
    K8S
    redis
    Kafka SASL
    소프트웨어 마에스트로
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
개발이조아용
[LeetCode Medium] 550. Game Play Analysis IV
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.