문제 링크
https://leetcode.com/problems/immediate-food-delivery-ii/description/
Table: Delivery
+-----------------------------+---------+
| Column Name | Type |
+-----------------------------+---------+
| delivery_id | int |
| customer_id | int |
| order_date | date |
| customer_pref_delivery_date | date |
+-----------------------------+---------+
delivery_id is the column of unique values of this table.
The table holds information about food delivery to customers that make orders at some date and specify a preferred delivery date (on the same order date or after it).
If the customer's preferred delivery date is the same as the order date, then the order is called immediate; otherwise, it is called scheduled.
The first order of a customer is the order with the earliest order date that the customer made. It is guaranteed that a customer has precisely one first order.
Write a solution to find the percentage of immediate orders in the first orders of all customers, rounded to 2 decimal places.
The result format is in the following example.
Example 1:
Input:
Delivery table:
+-------------+-------------+------------+-----------------------------+
| delivery_id | customer_id | order_date | customer_pref_delivery_date |
+-------------+-------------+------------+-----------------------------+
| 1 | 1 | 2019-08-01 | 2019-08-02 |
| 2 | 2 | 2019-08-02 | 2019-08-02 |
| 3 | 1 | 2019-08-11 | 2019-08-12 |
| 4 | 3 | 2019-08-24 | 2019-08-24 |
| 5 | 3 | 2019-08-21 | 2019-08-22 |
| 6 | 2 | 2019-08-11 | 2019-08-13 |
| 7 | 4 | 2019-08-09 | 2019-08-09 |
+-------------+-------------+------------+-----------------------------+
Output:
+----------------------+
| immediate_percentage |
+----------------------+
| 50.00 |
+----------------------+
Explanation:
The customer id 1 has a first order with delivery id 1 and it is scheduled.
The customer id 2 has a first order with delivery id 2 and it is immediate.
The customer id 3 has a first order with delivery id 5 and it is scheduled.
The customer id 4 has a first order with delivery id 7 and it is immediate.
Hence, half the customers have immediate first orders.
접근 방법
SELECT
COUNT(CASE WHEN MIN(order_date)=MIN(customer_pref_delivery_date) THEN 1 END) / COUNT(order_date) * 100 AS immediate_percentage
FROM Delivery
GROUP BY customer_id
GPT :
The error you're seeing occurs because aggregate functions like MIN cannot be used within the CASE expression directly inside COUNT. To fix this, we can use a subquery to calculate the minimum order_date and customer_pref_delivery_date for each customer_id, and then apply the CASE expression in the main query. Here’s the corrected
: MIN 은 CASE 와 COUNT 안에 직접적으로 사용할 수 없다.
내 쿼리
SELECT ROUND(COUNT(CASE WHEN sub.immediateYN = 1 THEN 1 end)/COUNT(sub.immediateYN)*100,2) as immediate_percentage FROM (SELECT CASE WHEN MIN(order_date)=MIN(customer_pref_delivery_date) THEN 1 ELSE 0 END AS immediateYN FROM Delivery GROUP BY customer_id) sub
다른 사람 쿼리
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 );