오랑우탄의 반란

LeetCode 리트코드 | 1174. Immediate Food Delivery II (MySQL) 본문

SQL/LeetCode

LeetCode 리트코드 | 1174. Immediate Food Delivery II (MySQL)

5&2 2024. 7. 11. 14:46
반응형

 

오늘도 오랑이는 문제를 풉니다.

 

1174. Immediate Food Delivery II

 

풀이 과정

우선 first order에 대한 조건을 정리해줍니다.

where (delivery_id, order_date) in (select delivery_id, min(order_date) from delivery group by 1)

 

그리고 이에 대한 count 를 구해줍니다.

avg 함수를 쓰면 우리가 원하는 결과를 sum / 없이 간단하게 구할 수 있습니다. 

이때 avg 안에 if __ 1, 0 으로 함수를 넣었는데 따로 숫자를 지정해주지 않아도 알아서 일치하는 값 (True) 에 대해서 1, 불일치 값 (False) 에 대해서 0을 출력해서 평균이 구해집니다.  

select avg(customer_pref_delivery_date = order_date)*100
from delivery 
where (delivery_id, order_date) in (select delivery_id, min(order_date) from delivery group by 1)

 

마지막으로 round를 해주면 완성입니다. 

 

최종 코드

select round(avg(customer_pref_delivery_date = order_date)*100,2) as immediate_percentage 
from delivery
where (customer_id, order_date) in (select customer_id, min(order_date) from delivery group by 1) ;

 


더 효율적인 쿼리로는 first order 를 구하기 위해 row_number 윈도우 함수를 사용하는 것입니다.

where ~ in 서브쿼리를 사용할 경우 느리고 효율이 떨어지기 때문에 서브쿼리나 group by 를 사용하지 않는 방식입니다. 

SELECT ROUND(AVG(ORDER_DATE=CUSTOMER_PREF_DELIVERY_DATE)*100,2) AS IMMEDIATE_PERCENTAGE
FROM (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY CUSTOMER_ID ORDER BY ORDER_DATE) AS RNK
    FROM DELIVERY 
) A
WHERE RNK=1

 

 

 

 

오랑우탄이 영어를 하고 오랑이가 쿼리마스터가 되는 그날까지~

 

https://leetcode.com/problems/immediate-food-delivery-ii/description/

 

반응형