오랑우탄의 반란
LeetCode 리트코드 | 1174. Immediate Food Delivery II (MySQL) 본문
반응형
오늘도 오랑이는 문제를 풉니다.
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/
반응형
'SQL > LeetCode' 카테고리의 다른 글
LeetCode 리트코드 | 1045. Customers Who Bought All Products (MySQL) (0) | 2024.07.15 |
---|---|
LeetCode 리트코드 | 550. Game Play Analysis IV (MySQL) DATE_ADD/DATE_SUB 시간과 날짜 계산 (0) | 2024.07.11 |
LeetCode 리트코드 | 1193. Monthly Transactions I (MySQL) (0) | 2024.07.11 |
LeetCode 리트코드 | 1251. Average Selling Price (MySQL) (0) | 2024.07.09 |
LeetCode 리트코드 | 1934. Confirmation Rate (MySQL) (0) | 2024.07.08 |