홍동이의 성장일기

[LeetCode] 1174. Immediate Food Delivery II (집계함수에 조건 작성하기) 본문

Tool/SQL 코딩테스트 풀이

[LeetCode] 1174. Immediate Food Delivery II (집계함수에 조건 작성하기)

홍동2 2023. 12. 22. 15:23

 

 

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(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)
    FROM delivery
    GROUP BY customer_id
)

 

💡 문제 풀이

 

1️⃣ customer_id 별로 최초의 order_date를 구해줍니다.

SELECT customer_id, MIN(order_date)
FROM delivery
GROUP BY customer_id

 

 

2️⃣ 다중행 서브쿼리를 사용하여 위 조건에 해당하는 행만 추출해줍니다.

WHERE (customer_id, order_date) IN (
    SELECT customer_id, MIN(order_date)
    FROM delivery
    GROUP BY customer_id
)

 

 

AVG(order_date = customer_pref_delivery_date)

 

3️⃣ 마지막으로 immediate 고객의 비율을 구해야합니다.

      오늘도 처음보는 풀이를 발견해서 뤼튼에게 자세한 사용법을 물어봤습니다.

 

💁 쿼리에서 사용된 `AVG` 함수는 조건에 만족하는 레코드들의 개수를 평균내는 것이 아닌, 조건에 만족하는 레코드들의 비율을 계산하는 용도로 사용됩니다. 쿼리에서 `AVG(order_date = customer_pref_delivery_date)`는 `order_date`와 `customer_pref_delivery_date`가 일치하는 경우를 1로, 일치하지 않는 경우를 0으로 표현한 후에, 해당 값들의 평균을 계산하는 것입니다. 따라서 결과는 0과 1 사이의 비율로 표시되며, 해당 비율은 `customer_id`별로 계산되어 첫 번째 행에 반환됩니다.

 

 

 

복잡해질 수 있는 수식을 간단히 해결해주는 좋은 방법인 것 같습니다 😊

 

해당 기능이 없이 값을 구하려면

WITH cte_type AS (
    SELECT *
            , CASE
                WHEN order_date = customer_pref_delivery_date THEN 1
                ELSE 0
            END as count_type
    FROM delivery
    WHERE (customer_id, order_date) IN (
        SELECT customer_id, MIN(order_date)
        FROM delivery
        GROUP BY customer_id
    )    
)
SELECT ROUND(AVG(count_type) * 100, 2) as immediate_percentage
FROM cte_type

 

이처럼 CASE 구문을 사용하여 조건에 맞는 행에 '1'이라는 값을 부여하고 이에 대한 평균을 구해주기 위해 cte구문을 사용해주어야하기 때문입니다.

 

모르는 기능을 하나씩 알아가는 것이 코딩테스트의 묘미인 것 같습니다 😳

728x90
Comments