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 함수를 기억하자 !!
📚문제
'♟️ 알고리즘 > Leetcode' 카테고리의 다른 글
Leetcode[MySQL][Leet Code] 1070. Product Sales Analysis III (Medium) (0) | 2025.03.05 |
---|---|
[MySQL][Leet Code] 550. Game Play Analysis IV (Medium) (0) | 2025.03.04 |
[MySQL][Leet Code] 1633. Percentage of Users Attended a Contest (Easy) (1) | 2025.02.18 |
[MySQL][Leet Code] 1251. Average Selling Price (Easy) (0) | 2025.02.18 |
[MySQL][Leet Code] 1934. Confirmation Rate (Medium) (0) | 2025.02.18 |