SQL/DataLemar
[PostgreSQL] (Medium) Sending vs. Opening Snaps [Snapchat SQL Interview Question]
oatmeal
2023. 12. 28. 17:14
SELECT age_bucket
, ROUND(sending/(sending+opening) * 100.0, 2) AS send_perc
, ROUND(opening/(sending+opening) * 100.0, 2) AS open_perc
FROM (
SELECT age_bucket
, SUM(CASE WHEN activity_type = 'open' THEN time_spent ELSE 0 END) AS opening
, SUM(CASE WHEN activity_type = 'send' THEN time_spent ELSE 0 END) AS sending
FROM activities
JOIN age_breakdown USING (user_id)
WHERE activity_type IN ('open', 'send')
GROUP BY age_bucket) sub;
mysql에서도 그대로 쓸 수 있는 쿼리!
솔루션을 보니 필터라는 함수도 있다
SELECT
age.age_bucket,
ROUND(100.0 *
SUM(activities.time_spent) FILTER (WHERE activities.activity_type = 'send')/
SUM(activities.time_spent),2) AS send_perc,
ROUND(100.0 *
SUM(activities.time_spent) FILTER (WHERE activities.activity_type = 'open')/
SUM(activities.time_spent),2) AS open_perc
FROM activities
INNER JOIN age_breakdown AS age
ON activities.user_id = age.user_id
WHERE activities.activity_type IN ('send', 'open')
GROUP BY age.age_bucket;
코드가 길어지지만,, 이해하기는 쉬운 듯!
문제 출처: