SQL/문제풀이

[LeetCode] immediate-food-delivery-ii

응엉잉 2024. 3. 5. 15:32

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

 

Immediate Food Delivery II - LeetCode

Can you solve this real interview question? Immediate Food Delivery II - Table: Delivery +-----------------------------+---------+ | Column Name | Type | +-----------------------------+---------+ | delivery_id | int | | customer_id | int | | order_date | d

leetcode.com

내 쿼리는 다음과 같다

SELECT ROUND(COUNT(CASE WHEN imd_order = 'immediate' THEN customer_id ELSE NULL END)*100
    /COUNT(customer_id), 2) AS immediate_percentage
FROM (
SELECT customer_id,
    order_date,
    customer_pref_delivery_date,
    CASE WHEN order_date = customer_pref_delivery_date THEN 'immediate'
        ELSE 'scheduled' END AS imd_order
FROM delivery
WHERE (customer_id, order_date) IN (
    SELECT customer_id,
        MIN(order_date) AS first_order
    FROM Delivery
    GROUP BY customer_id)
) A

 

1. customer별 first_order 구하기

SELECT customer_id,
	MIN(order_date) AS first_order
FROM Delivery
GROUP BY customer_id

 

2. 1번 쿼리를 WHERE 절 서브쿼리로 사용하여 유저별 first_order의 주문일자, 수령희망일자를 뽑은 후

해당 column들을 이용해 immediate와 scheduled 구분하는 column 생성 (CASE문 이용)

SELECT customer_id,
    order_date,
    customer_pref_delivery_date,
    CASE WHEN order_date = customer_pref_delivery_date THEN 'immediate'
        ELSE 'scheduled' END AS imd_order
FROM delivery
WHERE (customer_id, order_date) IN (
    SELECT customer_id,
        MIN(order_date) AS first_order
    FROM Delivery
    GROUP BY customer_id)

 

3. 2번을 FROM절 서브쿼리에 집어넣은 후 immediate_percentage를 구하기 위한 계산식 작성

SELECT ROUND(COUNT(CASE WHEN imd_order = 'immediate' THEN customer_id ELSE NULL END)*100
    /COUNT(customer_id), 2) AS immediate_percentage
FROM (
SELECT customer_id,
    order_date,
    customer_pref_delivery_date,
    CASE WHEN order_date = customer_pref_delivery_date THEN 'immediate'
        ELSE 'scheduled' END AS imd_order
FROM delivery
WHERE (customer_id, order_date) IN (
    SELECT customer_id,
        MIN(order_date) AS first_order
    FROM Delivery
    GROUP BY customer_id)
) A

 

Solution을 보니까 더 쉽게 풀 수 있는 방법이 있더라 !

WHERE절 사용까지는 비슷한데 굳이 column을 만들지 않고 풀 수 있는 쿼리가 있다.

SELECT 
	ROUND(AVG(order_date = customer_pref_delivery_date)*100, 2) AS immediate_percentage
FROM delivery
WHERE (customer_id, order_date) IN (
    SELECT customer_id,
        MIN(order_date) AS first_order
    FROM Delivery
    GROUP BY customer_id)

AVG 함수를 이용해서 조건을 만족하는 row 수의 평균을 구해줄 수도 있다! 우와 ~