Problem
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.
Solution
Method 1 – Window Functions and Aggregation
Intuition
We want to find, for each customer, their first order and check if it was immediate (order date equals preferred delivery date). Then, we calculate the percentage of such immediate first orders among all customers.
Approach
- Use a window function (ROW_NUMBER) to identify the first order for each customer by ordering their orders by order_date.
- Filter to only the first order per customer.
- Count how many of these first orders are immediate (order_date = customer_pref_delivery_date).
- Calculate the percentage and round to 2 decimal places.
Code
|
|
|
|
|
|
Complexity
- ⏰ Time complexity:
O(n)
— We scan all rows once to find first orders and count immediate ones. - 🧺 Space complexity:
O(n)
— We may need to store all rows for grouping and windowing.