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.
# 쿼리를 작성하는 목표, 확인할 지표 : 첫주문 중에서 immediate(첫주문이=preffer_day)의 비율 / order_date, customer_pref_delivery_date
# 쿼리 계산 방법 : 1. group by min을 사용해서 첫 주문과 첫 주문 했을 때의 pref_day 가져오기 -> 2. sum(pref_date와 같은 경우는 1 아니면 0) 으로 immediate가 몇 개인지 구하기 -> 3. immediate / first_order 로 비율 구하기
# 데이터의 기간 : x
# 사용할 테이블 : delivery
# JOIN KEY : x
# 데이터 특징 : x
WITH base AS (
SELECT
customer_id,
# 1
MIN(order_date) AS first_order,
MIN(customer_pref_delivery_date) AS preff_date
FROM delivery
GROUP BY
customer_id
)
SELECT
# 3
DISTINCT
ROUND((immediate_cnt / total_cnt) * 100.0, 2) AS immediate_percentage
FROM (
SELECT
COUNT(*) OVER() AS total_cnt,
# 2
SUM(CASE WHEN first_order = preff_date THEN 1 ELSE 0 END) OVER() AS immediate_cnt,
CASE WHEN first_order = preff_date THEN 1 ELSE 0
END AS t_or_f
FROM base
) AS a
'[SQL]' 카테고리의 다른 글
LeetCode 코딩 테스트 - Managers with at Least 5 Direct Reports(LV.Medium) (0) | 2025.03.17 |
---|---|
LeetCode 코딩 테스트 - Investments in 2016(LV.Medium) (0) | 2025.03.17 |
LeetCode 코딩 테스트 - Department Highest Salary(LV.Medium) (0) | 2025.03.15 |
LeetCode 코딩 테스트 - Restaurant Growth(LV.Medium) (0) | 2025.03.13 |
LeetCode 코딩 테스트 - Product Price at a Given Date(LV.Medium) (0) | 2025.03.12 |