본문 바로가기
SQL/코딩테스트

[leetcode / MySQL] 511. Game Play Analysis1

by Hi_heidi 2024. 2. 1.

문제

💡 Write a solution to find the first login date for each player. Return the result table in any order.

 

테이블 형태

 

풀이

SELECT player_id, first_login
FROM (
    SELECT ROW_NUMBER() OVER (PARTITION BY player_id ORDER BY event_date) AS row_n
            , player_id
            , event_date AS first_login
    FROM Activity
) activity
WHERE row_n=1

 

해설

FROM (
    SELECT ROW_NUMBER() OVER (PARTITION BY player_id ORDER BY event_date) AS row_n
            , player_id
            , event_date AS first_login
    FROM Activity
) activity
  • 유저별로 첫 로그인 날짜를 출력하는 문제다
  • 윈도우 함수 중 ROW_NUMBER를 사용해 player_id별로 event_date를 오름차순 정렬해 낮은 값부터 순위를 매겨 주었다. 이를 FROM절 서브쿼리로 감싸 테이블을 만든다
윈도우 함수 중 랭킹 함수
  RANK() DENSE_RANK() ROW_NUMBER()
동점처리 값이 같으면 같은 순위 부여 값이 같으면 같은 순위 부여 값이 같아도 다른 순위 부여
동점순위 같은 순위가 여러 개면 중복만큼 건너뜀(ex. 4위 2명, 5위 0명, 6위 1명) 같은 순위가 여러 개라도 건너뜀 없이 부여(ex. 4위 2명, 5위 1명) 행에 번호를 매기는 함수, 같은 순위는 없음
 

MySQL :: MySQL 8.3 Reference Manual :: 12.20.1 Window Function Descriptions

12.20.1 Window Function Descriptions This section describes nonaggregate window functions that, for each row from a query, perform a calculation using rows related to that row. Most aggregate functions also can be used as window functions; see Section 12

dev.mysql.com

SELECT player_id, first_login
...
WHERE row_n=1
  • 메인 쿼리에서 WHERE절에 row_n=1인 값을 출력하여 유저별로 매겨진 첫 번째 로그인날 데이터가 필터링되도록 하고, SELECT문에서 필요한 컬럼명을 지정해 출력한다