# ๋ฌธ์
https://leetcode.com/problems/game-play-analysis-iv/description/
# ๋ฌธ์ ์์ฝ
ํ์์์ด๋ ์ค ์ต์ด์ ์ํ ๋ค์๋ ๊น์ง ์ ์ํ์ฌ๋ ๋น์จ ๊ตฌํ๊ธฐ
# ๋ฌธ์ ์์ด๋์ด
sql๋ฌธ์ ๋ฅผ ํ ๋๋ ์ฝ๋ฉํ ์คํธ ๋ฌธ์ ๋ฅผ ํธ๋ ๊ฒ์ฒ๋ผ ์ด๋ป๊ฒ ์ ๊ฐํ ๊ฒ์ธ์ง ๊ตฌ์ํ๊ณ ์์ํ์
start_day ํ ์ด๋ธ : ์ ์ ๋ณ ์์ด๋, ์ฒซ์งธ๋ ๋ ์ง
cte ํ ์ด๋ธ : start_day ํ ์ด๋ธ๊ณผ Activity ํ ์ด๋ธ left join
[ ๋ฐ์ดํฐ ์ฝ์ ]
INSERT INTO Activity (player_id, device_id, event_date, games_played) VALUES
(1, 2, '2016-03-01', 5),
(1, 2, '2016-03-02', 6),
(2, 3, '2017-06-25', 1),
(3, 1, '2016-03-02', 0),
(3, 4, '2018-07-03', 5);
[ cte ํ ์ด๋ธ ]
with start_day as (
select player_id,
min(event_date) as min_date
from Activity
group by player_id
), cte as (
select a.player_id,
a.min_date,
b.event_date
from start_day a
left join Activity b
on a.player_id = b.player_id
and date_add(a.min_date, interval 1 day) = b.event_date
)
select *
FROM cte
[ ๊ฒฐ๊ณผ ]
# ๋ฌธ์ ํต์ฌ๊ฐ๋
๋ ๊ทธ๋ฌ๋ฏ์ด with์ , left join, count๋ฅผ ์ด์ฉํ์๋ค
ํน์ด์ฌํญ์ start_day๋ฅผ ๋ง๋ค๋ group by player_id๋ฅผ ํ ํ cteํ ์ด๋ธ์์ ์กฐ์ธ์ ์๋ํ๊ธฐ ๋๋ฌธ์ ๋น์จ์ ๊ตฌํ ๋ null๊ฐ์ ์ ์ธ์ํจ count(event_date) / count(*)๋ฅผ ์ฌ์ฉํ์๋ค
ํท๊ฐ๋ฆฌ๋ฉด ๋ฆฌํธ์ฝ๋ ๋ด์์ ์ณ๋ณด๊ธฐ
# ๋ฌธ์ ์ ๋ต
with start_day as (
select player_id,
min(event_date) as min_date
from Activity
group by player_id
), cte as (
select a.player_id,
a.min_date,
b.event_date
from start_day a
left join Activity b
on a.player_id = b.player_id
and date_add(a.min_date, interval 1 day) = b.event_date
)
select round(
count(event_date) / count(*)
,2) AS fraction
FROM cte