♟️ 알고리즘/Leetcode

[MySQL][Leet Code] 1174. Immediate Food Delivery II (Medium)

Jerry_K 2025. 3. 4. 15:48


https://leetcode.com/problems/immediate-food-delivery-ii/submissions/1562280627/?envType=study-plan-v2&envId=top-sql-50


🗒️SQL 코드 풀이 

# Write your MySQL query statement below
SELECT
    ROUND(
        SUM(
            CASE
                WHEN kind_of_delivery = "immediate" THEN 1 
                ELSE 0 
            END
        ) * 100 / COUNT(*),
        2
    ) AS immediate_percentage 
FROM 
    (
    SELECT 
        customer_id,
        MIN(order_date) AS order_date
    FROM Delivery 
    GROUP BY customer_id 
) A
INNER JOIN
    (
    SELECT 
        customer_id, 
        order_date ,
        CASE 
            WHEN 
                order_date  = customer_pref_delivery_date THEN "immediate"
            ELSE "scheduled"
        END kind_of_delivery
    FROM Delivery
) B
ON A.order_date = B.order_date 
AND A.customer_id = B.customer_id ;

 

1. 쿼리문만 보면 엄청 어려워보이는데 생각보다 간단하다. 

 

2. customer_id 그룹화하고 MIN 함수로 order_date가 가장 최신인 서브쿼리를 만들어준다.

 

3.  그리고 "immediate"와 "scheduled" 를 구분하는 컬럼이 있는 서브쿼리를 만들어준다.

 

4. 2개의 서브쿼리를 INNER JOIN 해준다. (공통적인 것만 필요하므로)

 

5.그리고 조건에 맞춰서 계산을 해주면 된다.

 

 

 

📌 문제 코멘트 

날짜 순으로 정렬  이후 GROUP BY를 하여 id 별 최신 날짜를 뽑아내고 싶었다.

하지만 GROUP BY -> ORDER BY 순이여서 역으로 하지 못했고 결국 문제 접근에 실패했다.

 

하지만 이 문제는 GROUP BY 이후 MIN 함수로 SELECT하여 간단하게 풀이 가능했다.

  • MIN 함수를 기억하자 !! 

📚문제