Find first login, then join to day-plus-one activity
WITH first_logins AS (
SELECT
player_id,
MIN(event_date) AS first_login_date
FROM activity
GROUP BY player_id
)
SELECT
ROUND(
COUNT(DISTINCT a2.player_id) * 1.0
/ COUNT(DISTINCT f.player_id),
2
) AS fraction
FROM first_logins f
LEFT JOIN activity a2
ON a2.player_id = f.player_id
AND DATE(a2.event_date) = DATE(f.first_login_date, '+1 day')This is the clearest retention pattern. It anchors every player on their first login date, then checks whether a qualifying return event exists exactly one day later.