문제
각 플레이어의 첫 로그인 날짜를 구하는 문제였다.
문제 풀이
MIN 사용한 풀이
SELECT player_id, MIN(event_date) AS first_login
FROM Activity
GROUP BY player_id;
JOIN 사용한 풀이
SELECT a1.player_id, a1.event_date AS first_login
FROM Activity a1
LEFT JOIN Activity a2
ON a1.player_id=a2.player_id AND a1.event_date>a2.event_date
WHERE a2.player_id IS NULL;
/* ON 조건에 해당하지 않은 a2는 모두 NULL이기 때문에
꼭 player_id가 아닌 a2의 컬럼 중 하나여도 된다. */
a1.player_id | a1.event_date | a2.event_date | 설명 |
1 | 2016-03-01 | NULL | 최솟값 |
1 | 2016-05-02 | 2016-03-01 | 제거됨 |
2 | 2017-06-25 | NULL | 최솟값 |
3 | 2016-03-02 | NULL | 최솟값 |
3 | 2018-07-03 | 2016-03-02 | 제거됨 |
여기서 LEFT JOIN이 아닌 INNER JOIN을 쓴다면 ON 조건을 만족하는 행만 결과에 남긴다. 그러면 a2.event_date=NULL인 행은 조건 불일치로 결과에 포함되지 않고 결국 NULL이 있던 최솟값인 행들 자체가 사라져버린다.
'코딩테스트 > LeetCode' 카테고리의 다른 글
[LeetCode/MySQL]607. Sales Person (0) | 2025.05.10 |
---|---|
[LeetCode/MySQL]577. Employee Bonus (0) | 2025.05.09 |
[LeetCode/MySQL]197. Rising Temperature (0) | 2025.05.04 |
[LeetCode/MySQL]196. Delete Duplicate Emails (0) | 2025.05.04 |
[LeetCode/MySQL]183. Customers Who Never Order (0) | 2025.05.04 |