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