1174. 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.
Solutions
Solution 1: Subquery
Thinking
Only each customer's first order counts. A subquery takes MIN(order_date) per customer_id; the outer query keeps those rows and averages the date-equality flag times \(100\).
We can use a subquery to first find the first order of each user, and then calculate the proportion of instant orders.
1 2 3 4 5 6 7 8 9 10 | |
Solution 2: Window Function
Thinking
Method 1 uses a pairwise IN subquery. RANK() OVER (PARTITION BY customer_id ORDER BY order_date) marks first orders; filter \(rk=1\) and average, without the subquery.
We can use the RANK() window function to rank the orders of each user in ascending order by order date, and then filter out the orders with a rank of \(1\), which are the first orders of each user. After that, we can calculate the proportion of instant orders.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |