문제
- LeetCode SQL 문제
1174. Immediate Food Delivery II / Medium
- 문제 내용 : [링크]
내가 작성한 Query
with temp_01 as( select customer_id , case when datediff(min(order_date), min(customer_pref_delivery_date)) = 0 then 1 else 0 end as cnt from delivery group by customer_id) select round(sum(cnt)/count(*)*100, 2) as immediate_percentage from temp_01
customer_id
별 'immediate_percentage'를 구해야 하므로, customer_id
기준으로 GROUP BY
해 준다.
고객별 첫 주문('first order')의 order_date
와 customer_pref_delivery_date
의 날짜가 같은 경우 이를 'immediate'로 정의한다. 따라서 CASE WHEN THEN
구문을 통해 order_date
의 min 값과 customer_pref_delivery_date
의 min 값의 일수 차이를 DATEDIFF()
함수를 통해 구해주고, 그 값이 0인 데이터는 1 아니면, 0을 출력해준다.
즉 order_date
와 customer_pref_delivery_date
의 날짜가 같은 경우만 1을 출력해준다.
왜 MIN()
사용했나 ? : 고객의 최초 주문 데이터에 대한 계산이므로, 일자에 MIN()
함수를 사용하면 최초 주문 데이터를 구할 수 있다.
위에서 구한 데이터들을 temp_01
으로 설정
전체 인원 대비 최초 주문이 'immediate' 인 고객의 총 인원의 비율을 구한다.
SUM(cnt) / COUNT(*) * 100
ROUND()
함수를 통해 소수 둘째자리까지의 백분율을 구하고 immediate_percentage
컬럼으로 출력한다.
일자를 구할 때, 최초 일자는 MIN()
함수를 사용할 수 있고, CASE WHEN THEN
을 구할 때 특정 조건을 만족하는 데이터의 개수를 추출할 수 있다.