coding/sql 코딩테스트

[리트코드] 1174. Immediate Food Delivery II

임이레 2025. 2. 20. 16:58

 

sql 코딩테스트는 어디서도 떨어지기 싫다는 목표로,, 매일 easy 든 medium이든 high 든 풀고있다.

 

[풀이과정]

 

정리하자면 문제에서 요구하는 바는 첫주문이면서,

customer_pref_delivery_date 와 첫주문 일자가 같은 Customer_id를 찾은 후  찾은 customer_id /전체 customer_id * 100 을 해주면 된다고 이해했다. 
 
[맞춘 정답 코드]
with sub_t as (
    select customer_id 
        , order_date
        , customer_pref_delivery_date
        , case when t.rk = 1 then 1 else 0 end as first_order 
        , case when t.order_date = t.customer_pref_delivery_date then 1 else 0 end as immediate
    from (
        select rank() over (partition by customer_id order by order_date asc) as rk 
            , delivery_id 
            , customer_id
            , order_date
            , customer_pref_delivery_date
        from  Delivery
    ) as t 
)


select  round((cnt / tot_cm ) * 100 ,2) as immediate_percentage 
from ( 
    select count(distinct customer_id) as tot_cm
        , count(distinct case when first_order = 1 and immediate = 1 then customer_id end) as cnt 
    from sub_t
) t_2

 

 

rank window 함수를 활용하여 첫주문을 찾아내고, 서브쿼리를 활용하여 답을 도출해냈다.

SQL은 데이터프레임에 대해 논리적으로 어떻게 설계할지를 잘 구상하면 그리 어렵지 않게 답을 찾아내는 것 같다 ㅠㅠ 근데 그게 어렵지..