SQL

Leetcode - 180. Game Play Analysis I

jjjk84 2023. 10. 31. 20:43
728x90

1. 문제

 

 

 

Table: Activity

+--------------+---------+
| Column Name  | Type    |
+--------------+---------+
| player_id    | int     |
| device_id    | int     |
| event_date   | date    |
| games_played | int     |
+--------------+---------+
(player_id, event_date) is the primary key (combination of columns with unique values) of this table.
This table shows the activity of players of some games.
Each row is a record of a player who logged in and played a number of games (possibly 0) before logging out on someday using some device.

 

Write a solution to find the first login date for each player.

Return the result table in any order.

 

 

https://leetcode.com/problems/game-play-analysis-i/

 

 

2. 문제 조건

 

1. Write a solution to find the first login date for each player.

 

-> 첫번째 방법. player_id로 group by 하여 min(event_date)을 구한다.

-> 두번째 방법. player_id별로 event_date가 빠른 날부터 rank를 달고, rank가 1인 것만 추출한다.

 

 

3. 코드 작성

 

-- 첫번째 방법 (GROUP BY 활용)
SELECT player_id
     , MIN(event_date) AS first_login
FROM activity
GROUP BY player_id


-- 두번째 방법 (WINDOW 함수 활용)
WITH date_rank AS (
    SELECT player_id
         , event_date
         , ROW_NUMBER() OVER (PARTITION BY player_id ORDER BY event_date) AS rankn
    FROM activity
)

SELECT player_id
     , event_date AS first_login
FROM date_rank
WHERE rankn = 1

 

 

 

4. 회고

 

  • 사실 이 문제는 GROUP BY와 집계함수를 이용하면 간단하게 풀 수 있는 문제다.
  • 하지만, WINDOW 함수인 ROW_NUMBER()를 활용법을 익히기에 적합하여 풀어보았다.
  • SQL을 공부하면서 같은 문제에 여러 방법으로 데이터를 추출할 수 있는 방법을 찾을 수 있다는 점이 흥미롭다. 실무에서는 이 중 효율적인 쿼리문을 활용하여 데이터를 추출할 수 있도록 유의해야겠다.
728x90