erDiagram
Food_Delivery {
int delivery_id PK
int customer_id
date order_date
date customer_pref_delivery_date
}
목표
유저의 첫 주문 중 당일 배송 상품의 비율 구하기
문제 풀이
첫 주문을 찾기 위해서는 유저별로 주문날짜, 배송날짜의 최소값을 가져온다.
그 중에서 주문날짜=배송날짜인 것을 찾는다.
전체 주문 수와 주문날짜=배송날짜인 것의 비율을 구한다.
MySQL
-- Solution 1
with temp as (
select *, min(order_date) as d1, min(customer_pref_delivery_date) as d2
from delivery
group by customer_id
),
cnt_filtered as (
select *, count(*) as cnt_f
from temp
where d1 = d2
),
cnt_all as (
select *, count(*) as cnt_a
from temp
)
select round(100*cnt_f/cnt_a,2) as immediate_percentage
from cnt_all, cnt_filtered
-- Solution 2
WITH TEMP AS (
SELECT
CUSTOMER_ID,
MIN(ORDER_DATE) AS FIRST_DATE
FROM DELIVERY
GROUP BY CUSTOMER_ID)
SELECT ROUND(100*COUNT(D.CUSTOMER_ID)/COUNT(*),2) AS IMMEDIATE_PERCENTAGE
FROM TEMP T
LEFT JOIN DELIVERY D ON T.CUSTOMER_ID = D.CUSTOMER_ID AND T.FIRST_DATE = D.CUSTOMER_PREF_DELIVERY_DATE
Solution 1
각 유저별로 첫 주문을 가져오면 된다.
주문 날짜, 발송 날짜의 최소값이 서로 같은 쿼리를 찾는다.
두 테이블의 row를 count로 세주고 round
Solution 2
유저의 첫 주문만 가져온 후, 원본 테이블과 LEFT JOIN을 진행한다.
ID + 첫주문이 일치하지 않으면, NULL값으로 나와서 전체 행과 그렇지 않은 행 비율을 구해주면 된다.
댓글