본문 바로가기

SQL/StrataScratch

[MySQL] (Medium) Acceptance Rate By Date

문제: 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을 안 세니까 수락된 친구 요청 수가 됨!

호오오,,