728x90
๐๏ธ ๋ฌธ์
[SQL50] 550. Game Play Analysis IV (AGGREGATE)
โ๐ป ํ์ด
๋ฌธ์ ํด์
์ ์ ๊ฐ ์ฒซ ๋ก๊ทธ์ธํ ๋ค์๋ ๋ค์ ๋ก๊ทธ์ธํ ๋น์จ์ ๊ตฌํ๋ ๋ฌธ์
๐ Table : Activity
Column Name | Type | ์ค๋ช |
player_id | int | ์ ์ ์ ๊ณ ์ ID |
device_id | int | ์ ์ ๊ฐ ๋ก๊ทธ์ธํ ์ฅ์น์ ID |
event_date | date | ๋ก๊ทธ์ธ ๋ ์ง |
games_played | int | ํด๋น ๋ก๊ทธ์ธ ๋์ ํ๋ ์ดํ ๊ฒ์ ์ (0์ผ ์๋ ์์) |
- PRIMARY KEY : (player_id, event_date)
- ํ ์ ์ (player_id)๊ฐ ๊ฐ์ ๋ (event_date)์ ์ฌ๋ฌ ๋ฒ ๋ก๊ทธ์ธํ ๊ธฐ๋ก์ ์๋ค.
๐ ์๊ตฌ ์ฌํญ
- ๊ฐ ์ ์ ์ ์ฒซ ๋ก๊ทธ์ธ ๋ ์ง(first_login)๋ฅผ ์ฐพ๋๋ค.
- ์ฒซ ๋ก๊ทธ์ธ ๋ ์ง์ ๋ค์๋ (first_login + 1์ผ)์๋ ๋ก๊ทธ์ธํ ์ ์ ๋ฅผ ์ฐพ๋๋ค.
- ์ด๋ฌํ ์ ์ ์๋ฅผ ์ ์ฒด ์ ์ ์๋ก ๋๋์ด ๋น์จ์ ๊ตฌํ๋ค.
- ๊ฒฐ๊ณผ๋ฅผ ์์์ ๋์งธ ์๋ฆฌ๊น์ง ๋ฐ์ฌ๋ฆผ(ROUND(..., 2)) ํ๋ค.
์ฝ๋
-- ์ฒซ ๋ก๊ทธ์ธ ๋ ์ง๋ฅผ ์ฐพ๋ CTE
WITH first_logins AS (
SELECT player_id, MIN(event_date) AS first_login -- ๊ฐ ํ๋ ์ด์ด์ ์ฒซ ๋ก๊ทธ์ธ ๋ ์ง๋ฅผ ๊ฐ์ ธ์ด
FROM Activity
GROUP BY player_id
),
-- ์ฒซ ๋ก๊ทธ์ธ ๋ค์๋ ๋ค์ ๋ก๊ทธ์ธํ ํ๋ ์ด์ด๋ฅผ ์ฐพ๋ CTE
next_day_logins AS (
SELECT A.player_id -- ์ฒซ ๋ก๊ทธ์ธ ๋ค์๋ ์ ์ํ ํ๋ ์ด์ด ID ๊ฐ์ ธ์ด
FROM first_logins A
JOIN Activity B
ON A.player_id = B.player_id
AND B.event_date = A.first_login + INTERVAL '1 DAY' -- ์ฒซ ๋ก๊ทธ์ธ ๋ค์๋ ์ ์ํ ๊ฒฝ์ฐ๋ง ์ ํ
)
-- ์ฒซ ๋ก๊ทธ์ธ ๋ค์๋ ๋ค์ ์ ์ํ ํ๋ ์ด์ด ๋น์จ ๊ณ์ฐ
SELECT ROUND(COUNT(next_day_logins.player_id) * 1.0 / COUNT(first_logins.player_id), 2) AS fraction
FROM first_logins
LEFT JOIN next_day_logins
ON first_logins.player_id = next_day_logins.player_id;
ํ์ด ๋ฐฉ์
- ์ฒซ ๋ก๊ทธ์ธ ๋ ์ง ์ฐพ๊ธฐ (CTE : first_logins)
- player_id ๋ณ๋ก ๊ฐ์ฅ ๋น ๋ฅธ ๋ก๊ทธ์ธ ๋ ์ง(MIN(event_date))๋ฅผ ์ฐพ๋๋ค.
- player_id์ ๋ํด ์ฒซ ๋ก๊ทธ์ธ ๋ ์ง(first_login)์ ๊ฐ๋ ์์ ํ ์ด๋ธ์ด ์์ฑ๋๋ค.
- ๋ค์๋ ๋ก๊ทธ์ธํ ์ ์ ์ฐพ๊ธฐ (CTE : next_day_logins)
- first_logins์ Activity๋ฅผ player_id ๊ธฐ์ค์ผ๋ก JOIN ํ๋ค.
- Activity ํ ์ด๋ธ์์ ์ ์ ์ ๋ก๊ทธ์ธ ๋ ์ง๊ฐ ์ฒซ ๋ก๊ทธ์ธ ๋ค์๋ (first_login + 1์ผ)์ธ ๊ฒฝ์ฐ๋ฅผ ์ฐพ๋๋ค.
- ๋ค์๋ ๋ค์ ๋ก๊ทธ์ธํ player_id ๋ชฉ๋ก์ ์ป๋๋ค.
- ๋ค์๋ ๋ก๊ทธ์ธํ ์ ์ ์ ๋น์จ ๊ณ์ฐ
- first_logins์ next_day_logins๋ฅผ player_id ๊ธฐ์ค์ผ๋ก LEFT JOIN ํ๋ค.
- (1) ์ฒซ ๋ก๊ทธ์ธ ๋ค์๋ ๋ค์ ๋ก๊ทธ์ธํ ์ ์ ์ : COUNT(next_day_logins.player_id)
- (2) ์ ์ฒด ์ ์ ์ : COUNT(first_logins.player_id)
- (1) / (2) ๋ก ๋น์จ ๊ณ์ฐํ ํ, ROUND๋ก ์์์ ๋์งธ ์๋ฆฌ๊น์ง ๋ฐ์ฌ๋ฆผํ๋ค.
ROUND
์์์ ๋์งธ ์๋ฆฌ๊น์ง ๋ฐ์ฌ๋ฆผ(ROUND(..., 2)) ํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
https://youngone-kang.tistory.com/51
[SQL] ROUND, CEIL, FLOOR (๋ฐ์ฌ๋ฆผ, ์ฌ๋ฆผ, ๋ด๋ฆผ)
โ ROUND() → ๋ฐ์ฌ๋ฆผโ CEIL() → ์ฌ๋ฆผโ FLOOR() → ๋ด๋ฆผ ๐ ROUND (๋ฐ์ฌ๋ฆผ)ROUND() ํจ์๋ ์ซ์๋ฅผ ๋ฐ์ฌ๋ฆผํ์ฌ ์ง์ ํ ์๋ฆฟ์๊น์ง ํํํ๋ ํจ์๊ธฐ๋ณธROUND(number, decimal_places)numb
youngone-kang.tistory.com
728x90
'coding_test > SQL ๋ฌธ์ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[LeetCode] 1193. Monthly Transactions I (AGGREGATE) (0) | 2025.02.19 |
---|---|
[LeetCode] 1211. Queries Quality and Percentage (AGGREGATE) (0) | 2025.02.11 |
[LeetCode] 1633. Percentage of Users Attended a Contest (AGGREGATE) (0) | 2025.02.10 |
[LeetCode] 1075. Project Employees I (AGGREGATE) (0) | 2025.02.10 |
[LeetCode] 1251. Average Selling Price (AGGREGATE) (0) | 2025.02.10 |