데이터 놀이터
Leetcode - 180. Game Play Analysis I 본문
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
'SQL' 카테고리의 다른 글
Leetcode - 262. Trips and Users (0) | 2023.12.06 |
---|---|
Leetcode - 601. Human Traffic of Stadium (0) | 2023.11.04 |
정규 표현식 (0) | 2023.10.20 |
Leetcode - 602. Friend Requests II: Who Has the Most Friends (0) | 2023.10.14 |
SQL 기타 - 주의할 점 (0) | 2023.10.07 |