문제: https://platform.stratascratch.com/coding/10285-acceptance-rate-by-date?code_type=3
나의 풀이:
with tb as (
select user_id_sender
, user_id_receiver
, min(date) as date
, count(*) as cnt
from fb_friend_requests
group by user_id_sender, user_id_receiver)
select date
, count(case when cnt = 2 then 1 end) / count(*) as rate
from tb
group by date
order by date;
그루핑을 어떻게 할 건지 고민을 조금 하다가 결국 풀었당!! 😊
하지만 뭔가 더 좋은 풀이가 있을거라는 생각이 드는...
솔루션:
with a as(select * from fb_friend_requests where action='accepted'),
b as(select * from fb_friend_requests where action='sent')
select b.date,count(a.user_id_receiver)/count(b.user_id_sender) from a right join b on a.user_id_sender=b.user_id_sender
and a.user_id_receiver=b.user_id_receiver group by date
오,, 확실히 솔루션이 더 쉬운 방법인듯!
먼저 'sent'와 'accepted'를 위드문으로 따로 테이블 두 개로 구분지은 다음,
'sent'는 있어도 'accepted'는 없을 수 있으니까 'sent'를 기준으로 아우터 조인을 하면 'accepted' 가 없는 데이터는 null로 조인이 되어서 쉽게 수락된 건과 수락되지 않은 건(null)을 한번에 확인할 수 있다.
그래서 조인한 상황에서
sent 테이블의 sender 아이디를 세면 전체 친구 요청 수가 되고
accepted 테이블의 receiver 아이디를 세면 카운트는 null을 안 세니까 수락된 친구 요청 수가 됨!
호오오,,
'SQL > StrataScratch' 카테고리의 다른 글
[MySQL] (Medium) Number Of Units Per Nationality (0) | 2024.02.14 |
---|---|
[MySQL] (Medium) Ranking Most Active Guests (0) | 2024.02.14 |
[MySQL] (Medium) Risky Projects (1) | 2024.02.08 |
[MySQL] (Medium) New Products (1) | 2024.02.08 |
[MySQL] (Medium) Finding User Purchases (2) | 2024.02.07 |