문제)
문제 뜻
ORDER_DATE와 CUSTOMER_PREF_DELIVERY_DATE가 같으면 즉시주문이고, CUSTOMER_ID 각각이 첫번째로 주문한 오더들 중에서 즉시주문의 비율을 구하는 문제.
어떻게 접근해야할까
내가 생각한 방안
첫번째로 즉시주문이란. case when 구문으로 ORDER_DATE와 CUSTOMER_PREF_DELIVERY_DATE가 같은경우 1, 아닌경우 0을 둬서 풀면 된다고 생각했다.
그러나, 두번째인 첫번째로 주문한 오더에서 막히고 말았다.... 아무 생각도 안나서 찾아보니 rank()함수를 쓰면 되는거였음 (아 맞다...) 나 예전에도 이런 sql을 현업에서 본적이 있었다! 근데 왜 지금은 까먹은것인가 정말 알수없는 기억력이다... 그때 열심히 정리까지 해놓고 ㅜㅜ
결국 case문만 써놓고 틀리고말았...
보니까 with 절까지 사용해서 임시 테이블을 만들고 select를 하는게 더 편해보였다
rank() over (partition by customer_id order by order_date)
그룹을 나눠 랭킹을 정하는 함수다!
customer_id로 내부 그룹바이를 한 다음에
(그러니까 1 1 2 2 3 3 4 4 이런식으로 customer_id가 그룹화된다.)
order_date로 그룹화된 범위 내에서 과거부터 order_date 정렬한다.
제일 내부 select문을 돌리면 output이 이렇게나옴
답
ranking=1을 따로 select * from ~ 문으로 묶어준 이유는 내부의 as ranking으로 설정해놓은 부분을 인식을 못하기 때문이다!
/* Write your PL/SQL query statement below */
with cte as(
select *
from(
select delivery_id,
customer_id,
order_date,
rank() over(partition by customer_id order by order_date) as ranking,
customer_pref_delivery_date,
(case when order_date=customer_pref_delivery_date then 1 else 0 end) as ordertime
from Delivery
) where ranking=1
)
select round(sum(ordertime)/count(*)*100,2) as immediate_percentage from cte